Функция 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()
будет аналогичен.