Функция std::find() ищет на определенном диапазоне элементов определенное значение. Для сравнения значений применяется операция сравнения ==. Рассмотрим одну из версий функции:
std::find(start_iterator, end_iterator, value)
Для установки диапазона в функцию передаются итератор на начало и конец диапазона и значение, которое надо найти. Результат функции - итератор на найденное значение. Если же значение не найдено, то возвращаемый итератор указывает на конец диапазона. Например, попробуем найти в векторе чисел некоторые числа
#include <iostream>
#include <vector>
#include <algorithm>
void findValue (const std::vector<int>& data, int value)
{
auto result{ std::find(begin(data), end(data), value) };
if (result == end(data))
std::cout << "Value not found" << std::endl;
else
std::cout << "Value found at position " << (result - begin(data)) << std::endl;
}
int main()
{
std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
findValue(numbers, 4); // Value found at position 3
findValue(numbers, 12); // Value not found
}
В данном случае поиск вынесен в отдельную функцию - findValue. В ней ищем в векторе чисел некоторое число. В качестве начала и конца диапазона для поиска в функцию std::find()
передаются итераторы на начало и конец вектор:
auto result{ std::find(begin(data), end(data), value) };
Если число не найдено, то полученный итератор равен итератору на конец вектора:
if (result == end(data))
Если же число найдено, то вычитая из полученного итератора итератор на начало вектора, мы можем получить индекс числа в векторе:
std::cout << "Value found at position " << (result - begin(data)) << std::endl;
Ряд дополнительных функций возвращают итератор на значение в зависимости от некоторого условия. Функция std::find_if() возвращает итератор на первый элемент диапазона,
который удовлетворяет некоторому условию. А функция std::find_if_not(), наоброт, возвращает итератор на первый элемент диапазона,
который НЕ удовлетворяет некоторому условиЮ. Посмотрим на примере функции std::find_if():
#include <iostream>
#include <vector>
#include <algorithm>
// если число четное
bool is_even(int n){ return n % 2 == 0;}
// если число положительное
bool is_positive(int n){ return n > 0;}
// если число больше 10
bool is_greater10(int n){ return n > 10;}
template <typename T>
void findValue (const std::vector<T>& data, bool(*condition)(T))
{
auto result{ std::find_if(begin(data), end(data), condition) };
if (result == end(data))
std::cout << "Value not found" << std::endl;
else
std::cout << "Value found at position " << (result - begin(data)) << std::endl;
}
int main()
{
std::vector<int> numbers { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
findValue(numbers, is_even); // Value found at position 1
findValue(numbers, is_positive); // Value found at position 6
findValue(numbers, is_greater10); // Value not found
}
Функция std::find_if() также получает итераторы на начало и конец дипазона для поиска, а третий параметр представляет условие, которому должны удовлетворять значения:
std::find_if(begin(data), end(data), condition)
Условие представляет функцию, которая принимает некоторое значение произвольного типа и возвращает значение типа bool - true, если значение соответствует условию, и
false, если не соответствует. Фактически условие можно описать указателем на функцию bool(*condition)(T), где T- произвольный тип.
Для теста здесь определены три функции, которые представляют условия: is_even() (проверяет, является ли число четным), is_positive()
(если число положительное) и is_greater10() (если число больше 10).
Функция std::find_if() возвращает итератор на первое найденное значение, которое удовлетворяет условию. Если таких значений не найдено, то итератор указывает на конец диапазона.
Принцип работы std::find_if_not() будет аналогичен.