Partager via


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

Voir aussi

Référence

<algorithm>

adjacent_find

find (STL)

find_if_not

find_end

mismatch

search