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, BinaryPredicate p ); |
(2) | |
Ищет в диапазоне [first, last) первую последовательность count одинаковых элементов, каждый из которых равен заданному значению value. Первый вариант использует operator== для сравнения элементов, второй вариант использует заданный бинарный предикат p.
Параметры
[first, last)
|
— | два итератора задающих диапазон элементов для проверки |
| count | — | длина искомой последовательности |
| value | — | значение элементов искомой последовательности |
| p | — | бинарный предикат, который возвращает true если элементы следует считать равными. Определение функции предиката должно быть эквивалентно следующему:
Определение не должно обязательно содержать |
| Требования к типам | ||
-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) |
находит первый элемент, соответствущий определённым критериям (шаблон функции) |
| ищет диапазон элементов (шаблон функции) |