Пространства имён
Варианты
Действия

std::find, std::find_if, std::find_if_not

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
findfind_iffind_if_not
(C++11)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
(1)
template< class InputIt, class UnaryPredicate >

InputIt find_if( InputIt first, InputIt last,

                 UnaryPredicate p );
(2)
template< class InputIt, class UnaryPredicate >

InputIt find_if_not( InputIt first, InputIt last,

                     UnaryPredicate q );
(3) (начиная с C++11)

Эти функции находят в диапазоне [first, last) первый элемент, удовлетворяющий определённым условиям:

1. find ищет элемент, равный value

2. find_if ищет элемент, для которого предикат p возвращает значение true

3. find_if_not ищет элемент, для которого предикат q возвращает значение false

Содержание

[править] Параметры

[firstlast) два итератора задающих диапазон элементов для проверки
value значение для сравнения с ним элементов
p унарный предикат, который возвращает​true для искомого элемента.

Определение функции предиката должно быть эквивалентно следующему:

 bool pred(const Type &a);

Присутствие const & в определении не обязательно, но функция не должна модифицировать передаваемые ей объекты.
Тип Type должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type. ​

q унарный предикат, который возвращает​false для искомого элемента.

Определение функции предиката должно быть эквивалентно следующему:

 bool pred(const Type &a);

Присутствие const & в определении не обязательно, но функция не должна модифицировать передаваемые ей объекты.
Тип Type должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type. ​

Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.

[править] Возвращаемое значение

Итератор на первый элемент, удовлетворяющий условию, или last, если такой элемент не найден.

[править] Сложность

Не больше last - first применений предиката.

[править] Возможная реализация

Первый вариант
template<class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value)
{
    for (; first != last; ++first) {
        if (*first == value) {
            return first;
        }
    }
    return last;
}
Второй вариант
template<class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p)
{
    for (; first != last; ++first) {
        if (p(*first)) {
            return first;
        }
    }
    return last;
}
Третий вариант
template<class InputIt, class UnaryPredicate>
InputIt find_if_not(InputIt first, InputIt last, UnaryPredicate q)
{
    for (; first != last; ++first) {
        if (!q(*first)) {
            return first;
        }
    }
    return last;
}

Если у вас нет C++11, то эквивалентом std::find_if_not является std::find_if с отрицанием предиката.

template<class InputIt, class UnaryPredicate>
InputIt find_if_not(InputIt first, InputIt last, UnaryPredicate q)
{
    return std::find_if(first, last, std::not1(q));
}

[править] Пример

В следующем примере в векторе целых чисел ищется заданное.

#include <iostream>
#include <algorithm>
#include <vector>
 
int main()
{
    int n1 = 3;
    int n2 = 5;
 
    std::vector<int> v{0, 1, 2, 3, 4};
 
    auto result1 = std::find(v.begin(), v.end(), n1);
    auto result2 = std::find(v.begin(), v.end(), n2);
 
    if (result1 != v.end()) {
        std::cout << "v содержит: " << n1 << '\n';
    } else {
        std::cout << "v не содержит: " << n1 << '\n';
    }
 
    if (result2 != v.end()) {
        std::cout << "v содержит: " << n2 << '\n';
    } else {
        std::cout << "v не содержит: " << n2 << '\n';
    }
}

Вывод:

v содержит: 3
v не содержит: 5

[править] См. также

находит первые два соседних элемента, которые равны (или удовлетворяют заданному предикату)
(шаблон функции) [править]
находит последнюю последовательность элементов в определённом диапазоне
(шаблон функции) [править]
ищет любой элемент из набора элементов
(шаблон функции) [править]
находит первую позицию, в которой два диапазона различаются
(шаблон функции) [править]
ищет диапазон элементов
(шаблон функции) [править]