Поделиться через


find_if

Находит позицию первого вхождения элемента, удовлетворяющего определенному условию, в диапазон.

template<class InputIterator, class Predicate> InputIterator find_if(InputIterator first, InputIterator last,        Predicate pred);

Параметры

  • first
    Входной итератор, адресующий положение первого элемента в диапазоне для поиска.

  • last
    Входной итератор, адресующий положение на единицу после последнего элемента в диапазоне для поиска.

  • pred
    Определенный пользователем объект функции предиката или лямбда-выражение, определяющее условие, которое должно удовлетворяться искомым элементом. Предикат берет один аргумент и возвращает true (условие удовлетворено) или false (условие не удовлетворено). Подпись pred должна быть bool pred(const T& arg);, где T — тип, к которому можно явным образом привести InputIterator при сбросе ссылки. Ключевое слово const показано только для демонстрации того, что объект функции или лямбда не должен изменять аргумент.

Возвращаемое значение

Входной итератор, ссылающийся на первый элемент в диапазоне, удовлетворяющий условию, заданному предикатом (результат предиката true). Если не найдено ни одного элемента, удовлетворяющего условию предиката, возвращается last.

Заметки

Эта функция шаблона представляет собой обобщение алгоритма find с заменой предиката «равно определенному значению» на любой предикат. Сведения о противоположной по назначению функции (которая находит первый элемент, не удовлетворяющий условию предиката), см. в разделе find_if_not.

Пример

// 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");
}

Вывод

                               

Требования

Заголовок: <algorithm>

Пространство имен: std

См. также

Ссылки

<algorithm>

adjacent_find

find (STL)

find_if_not

find_end

mismatch

search