Namespaces
Variants

std::experimental::ranges:: adjacent_find

From cppreference.net
Определено в заголовочном файле <experimental/ranges/algorithm>
template < ForwardIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectRelation < projected < I, Proj >> Pred = ranges:: equal_to <> >

I adjacent_find ( I first, S last, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class Proj = ranges:: identity ,

IndirectRelation < projected < ranges:: iterator_t < R > , Proj >> Pred = ranges:: equal_to <> >

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

Несмотря на приведённые выше объявления, фактическое количество и порядок параметров шаблона для объявлений алгоритмов не определено. Таким образом, если при вызове алгоритма используются явные аргументы шаблона, программа, вероятно, является непереносимой.

Содержание

Параметры

first, last - диапазон элементов для проверки
r - диапазон элементов для проверки
pred - предикат для сравнения проецируемых элементов
proj - проекция, применяемая к элементам

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

Итератор на первый элемент первой пары идентичных элементов, то есть первый итератор i такой, что оба i и i + 1 находятся в диапазоне [ first , last ) и ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) , ranges:: invoke ( proj, * ( i + 1 ) ) ) ! = false .

Если такие элементы не найдены, возвращается итератор, равный last .

Сложность

Если диапазон непуст, ровно min((result - first) + 1, (last - first) - 1) применений предиката, где result является возвращаемым значением, и не более чем вдвое больше применений проекции.

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

template<ForwardIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectRelation<projected<I, Proj>> Pred = ranges::equal_to<>>
I adjacent_find(I first, S last, Pred pred = Pred{}, Proj proj = Proj{})
{
    if (first == last)
        return first;
    I next = first;
    ++next;
    while (next != last)
    {
        if (ranges::invoke(pred, ranges::invoke(proj, *first),
                                 ranges::invoke(proj, *next)))
            return first;
        ++next;
        ++first;
    }
    return next;
}

Пример

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

находит первые два соседних элемента, которые равны (или удовлетворяют заданному предикату)
(шаблон функции)
удаляет последовательные дублирующиеся элементы в диапазоне
(шаблон функции)