std::find, std::find_if, std::find_if_not
| Определено в заголовочном файле <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 для искомого элемента. Определение функции предиката должно быть эквивалентно следующему:
Присутствие |
| q | — | унарный предикат, который возвращаетfalse для искомого элемента. Определение функции предиката должно быть эквивалентно следующему:
Присутствие |
| Требования к типам | ||
-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
См. также
| находит первые два соседних элемента, которые равны (или удовлетворяют заданному предикату) (шаблон функции) | |
| находит последнюю последовательность элементов в определённом диапазоне (шаблон функции) | |
| ищет любой элемент из набора элементов (шаблон функции) | |
| находит первую позицию, в которой два диапазона различаются (шаблон функции) | |
| ищет диапазон элементов (шаблон функции) |