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> ForwardIt1 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> ForwardIt1 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) |
Находит первый элемент, удовлетворяющий определенным критериям (шаблон функции) |
| Ищет первое вхождение последовательности элементов в диапазон (шаблон функции) | |