std::search_n
Определено в заголовочном файле <algorithm>
|
||
template< class ForwardIt, class Size, class T > ForwardIt1 search_n( ForwardIt first, ForwardIt last, Size count, const T& value ); |
(1) | |
template< class ForwardIt, class Size, class T, class BinaryPredicate > ForwardIt1 search_n( ForwardIt first, ForwardIt last, Size count, const T& value, |
(2) | |
Ищет в диапазоне [
first,
last)
первую последовательность count одинаковых элементов, каждый из которых равен заданному значению value. Первый вариант использует operator== для сравнения элементов, второй вариант использует заданный бинарный предикат p.
Содержание |
[править] Параметры
[ first, last)
|
— | два итератора задающих диапазон элементов для проверки |
count | — | длина искомой последовательности |
value | — | значени�� элементов искомой последовательности |
p | — | бинарный предикат, который возвращает true если элементы следует считать равными. Определение функции предиката должно быть эквивалентно следующему: bool pred(const Type1 &a, const Type2 &b); Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты. |
Требования к типам | ||
-ForwardIt должен соответствовать требованиям ForwardIterator .
|
[править] Возвращаемое значение
Итератор на начало найденной последовательности в диапазоне [
first,
last)
. Если такая последовательность не найдена, возвращается last.
[править] Сложность
Не больше last - first
применений предиката.
[править] Возможная реализация
Первый вариант |
---|
template<class ForwardIt, class Size, class T> ForwardIt search_n(ForwardIt first, ForwardIt last, Size count, const T& value) { Size curr_count = 0; ForwardIt result, t_last = first; std::advance(t_last, std::distance(first, last) - count + 1); for (; first != t_last; first++) { curr_count = 0; result = first; while (*first == value) { curr_count++; if (curr_count == count) { return result; } ++first; } } return last; } |
Второй вариант |
template<class ForwardIt, class Size, class T, class BinaryPredicate> ForwardIt search_n(ForwardIt first, ForwardIt last, Size count, const T& value, BinaryPredicate p) { Size curr_count = 0; ForwardIt result, t_last = first; std::advance(t_last, std::distance(first, last) - count + 1); for (; first != t_last; first++) { curr_count = 0; result = first; while (p(*first,value)) { curr_count++; if (curr_count == count) { return result; } ++first; } } return last; } |
[править] Пример
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool pred (int i, int j) { return (i==j); } int main () { vector<int> myvector {10,20,30,30,30,20,10,10,20}; //Поиск {30,30,30} auto it = search_n (begin(myvector), end(myvector), 3, 30); if (it!=end(myvector)) cout << "Последовательность {30,30,30} позиция: " << distance(begin(myvector), it) << '\n'; else cout << "Ничего не найдено\n"; //Поиск {10,10} it = search_n (begin(myvector), end(myvector), 2, 10, pred); if (it!=end(myvector)) cout << "Последовательность {10,10} позиция: " << distance(begin(myvector), it) << '\n'; else cout << "Ничего не найдено\n"; return 0; }
Вывод:
Последовательность {30,30,30} позиция: 2 Последовательность {10,10} позиция: 6
[править] См. также
находит последнюю последовательность элементов в определённом диапазоне (шаблон функции) | |
(C++11) |
находит первый элемент, соответствущий определённым критериям (шаблон функции) |
ищет диапазон элементов (шаблон функции) |