find_if
Recherche la position de la première occurrence d'un élément d'une plage qui répond à une condition spécifiée.
template<class InputIterator, class Predicate> InputIterator find_if(InputIterator first, InputIterator last, Predicate pred);
Paramètres
first
Itérateur d'entrée qui traite la position du premier élément de la plage à rechercher.last
Itérateur d'entrée qui traite la position située au-delà du dernier élément de la plage à rechercher.pred
Objet de fonction de prédicat défini par l'utilisateur ou expression lambda qui définit la condition à satisfaire par l'élément recherché. Un prédicat accepte un seul argument et retourne true (condition satisfaite) ou false (condition non satisfaite). La signature de pred doit être bool pred(const T& arg);, où T est un type dans lequel InputIterator peut être converti implicitement quand il est déréférencé. Le mot clé const s'affiche uniquement pour montrer que l'expression lambda ou l'objet de fonction ne doit pas changer l'argument.
Valeur de retour
Itérateur d'entrée qui fait référence au premier élément de la plage répondant à la condition spécifiée par le prédicat (le prédicat retourne true). Si aucun élément n'est trouvé pour satisfaire le prédicat, last est retourné.
Notes
Cette fonction avec modèle est une généralisation de l'algorithme find, et remplace le prédicat « est égal à une valeur spécifique » par un autre prédicat. Pour l'opposé logique (rechercher le premier élément qui ne satisfait pas le prédicat), consultez find_if_not.
Exemple
// cl.exe /W4 /nologo /EHsc /MTd
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
template <typename S> void print(const S& s) {
for (const auto& p : s) {
cout << "(" << p << ") ";
}
cout << endl;
}
// Test std::find()
template <class InputIterator, class T>
void find_print_result(InputIterator first, InputIterator last, const T& value) {
// call <algorithm> std::find()
auto p = find(first, last, value);
cout << "value " << value;
if (p == last) {
cout << " not found." << endl;
} else {
cout << " found." << endl;
}
}
// Test std::find_if()
template <class InputIterator, class Predicate>
void find_if_print_result(InputIterator first, InputIterator last,
Predicate Pred, const string& Str) {
// call <algorithm> std::find_if()
auto p = find_if(first, last, Pred);
if (p == last) {
cout << Str << " not found." << endl;
} else {
cout << "first " << Str << " found: " << *p << endl;
}
}
// Function to use as the UnaryPredicate argument to find_if() in this example
bool is_odd_int(int i) {
return ((i % 2) != 0);
}
int main()
{
// Test using a plain old array.
const int x[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << "array x[] contents: ";
print(x);
// Using non-member std::begin()/std::end() to get input iterators for the plain old array.
cout << "Test std::find() with array..." << endl;
find_print_result(begin(x), end(x), 10);
find_print_result(begin(x), end(x), 42);
cout << "Test std::find_if() with array..." << endl;
find_if_print_result(begin(x), end(x), is_odd_int, "odd integer"); // function name
find_if_print_result(begin(x), end(x), // lambda
[](int i){ return ((i % 2) == 0); }, "even integer");
// Test using a vector.
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back((i + 1) * 10);
}
cout << endl << "vector v contents: ";
print(v);
cout << "Test std::find() with vector..." << endl;
find_print_result(v.begin(), v.end(), 20);
find_print_result(v.begin(), v.end(), 12);
cout << "Test std::find_if() with vector..." << endl;
find_if_print_result(v.begin(), v.end(), is_odd_int, "odd integer");
find_if_print_result(v.begin(), v.end(), // lambda
[](int i){ return ((i % 2) == 0); }, "even integer");
}
Sortie
Configuration requise
En-tête : <algorithm>
Espace de noms : std