Namespaces
Variants

std::experimental::ranges:: search_n

From cppreference.net
Определено в заголовке <experimental/ranges/algorithm>
template < ForwardIterator I, Sentinel < I > S, class T,

class Pred = ranges:: equal_to <> , class Proj = ranges:: identity >
requires IndirectlyComparable < I, const T * , Pred, Proj >
I search_n ( I first, S last, ranges :: difference_type_t < I > count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class T, class Pred = ranges:: equal_to <> ,

class Proj = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R > , const T * , Pred, Proj >
ranges:: safe_iterator_t < R > search_n ( R && r,
ranges :: difference_type_t < ranges:: iterator_t < R >> count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) Выполняет поиск в диапазоне [ first , last ) первой последовательности из count элементов, спроецированные значения которых равны заданному значению value согласно предикату pred .
2) То же, что и (1) , но использует r в качестве исходного диапазона, как если бы использовались ranges:: begin ( r ) в качестве first и ranges:: end ( r ) в качестве last .

Содержание

Параметры

first, last - диапазон элементов для проверки
r - диапазон элементов для проверки
count - длина последовательности для поиска
value - значение для поиска
pred - предикат, сравнивающий проецируемые элементы с value
proj - проекция, применяемая к элементам

Возвращаемое значение

Итератор на начало найденной последовательности в диапазоне [ first , last ) . Если такая последовательность не найдена, возвращается итератор, равный last .

Сложность

Не более last - first применений предиката и проекции.

Возможная реализация

template<ForwardIterator I, Sentinel<I> S, class T,
         class Pred = ranges::equal_to<>, class Proj = ranges::identity>
    requires IndirectlyComparable<I, const T*, Pred, Proj>
I search_n(I first, S last, ranges::difference_type_t<I> count,
           const T& value, Pred pred = Pred{}, Proj proj = Proj{})
{
    for (; first != last; ++first)
    {
        if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
            continue;
        I candidate = first;
        ranges::difference_type_t<I> cur_count = 0;
        while (true)
        {
            ++cur_count;
            if (cur_count == count)
                // успех
                return candidate;
            ++first;
            if (first == last)
                // список исчерпан
                return first;
            if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
                // недостаточно подряд идущих элементов
                break;
        }
    {
    return first;
}

Пример

Смотрите также

ищет первое вхождение заданного количества последовательных копий элемента в диапазоне
(function template)
находит последнюю последовательность элементов в заданном диапазоне
(function template)
находит первый элемент, удовлетворяющий определенным критериям
(function template)
ищет диапазон элементов
(function template)