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

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

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
find
find_if
find_if_not


(C++11)
find_end
find_first_of
adjacent_find
search
search_n
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека 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

Содержание

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

first, last - диапазон элементов для проверки
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

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

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