Namespaces
Variants

std::ranges::adjacent_find

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, напримерranges::copy, ranges::sort, ...
Операции последовательности без изменения    
Пакетные операции
(C++17)
Операции поиска
Операции последовательности с изменением
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции двоичного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения(C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные<memory>алгоритмы

Специализированные<random>алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имёнstd::ranges
Операции последовательности без изменения
Операции последовательности с изменением
Операции разбиения
Операции сортировки
Операции двоичного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
       
       
Операции перестановок
Операции свёртки
Операции над неинициализированной памятью
Типы возвращаемых значений
 
Определён в заголовке<algorithm>
Сигнатура вызова
template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
          std::indirect_binary_predicate<
              std::projected<I, Proj>,
              std::projected<I, Proj>> Pred = ranges::equal_to >
constexpr I
    adjacent_find( I first, S last, Pred pred = {}, Proj proj = {} );
(1) (начиная с C++20)
template< ranges::forward_range R, class Proj = std::identity,
          std::indirect_binary_predicate<
              std::projected<ranges::iterator_t<R>, Proj>,
              std::projected<ranges::iterator_t<R>, Proj>> Pred = ranges::equal_to >
constexpr ranges::borrowed_iterator_t<R>
    adjacent_find( R&& r, Pred pred = {}, Proj proj = {} );
(2) (начиная с C++20)

Ищет в диапазоне[first, last)первые два последовательных равных элемента.

1)Элементы сравниваются с помощьюpred(после проецирования с помощью проекцииproj).
2)То же, что и(1), но используетrв качестве исходного диапазона, как если бы использовалисьranges::begin(r)какfirstиranges::end(r)какlast.

Функциональные объекты, описанные на этой странице, являютсяобъектами функций алгоритмов(неформально известными какniebloids), то есть:

Параметры

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

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

Итератор на первый из первой пары одинаковых элементов, то есть первый итераторitтакой, чтоbool(std::invoke(pred, std::invoke(proj1, *it), std::invoke(proj, *(it + 1))))являетсяtrue.

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

Сложность

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

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

struct adjacent_find_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
             std::indirect_binary_predicate<
                 std::projected<I, Proj>,
                 std::projected<I, Proj>> Pred = ranges::equal_to>
    constexpr I operator()(I first, S last, Pred pred = {}, Proj proj = {}) const
    {
        if (first == last)
            return first;
        auto next = ranges::next(first);
        for (; next != last; ++next, ++first)
            if (std::invoke(pred, std::invoke(proj, *first), std::invoke(proj, *next)))
                return first;
        return next;
    }

    template<ranges::forward_range R, class Proj = std::identity,
             std::indirect_binary_predicate<
                 std::projected<ranges::iterator_t<R>, Proj>,
                 std::projected<ranges::iterator_t<R>, Proj>> Pred = ranges::equal_to>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, Pred pred = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj));
    }
};

inline constexpr adjacent_find_fn adjacent_find;

Пример

#include <algorithm>
#include <functional>
#include <iostream>
#include <ranges>

constexpr bool some_of(auto&& r, auto&& pred) // some but not all
{
    return std::ranges::cend(r) != std::ranges::adjacent_find(r,
        [&pred](auto const& x, auto const& y)
        {
            return pred(x) != pred(y);
        });
}

// test some_of
constexpr auto a = {0, 0, 0, 0}, b = {1, 1, 1, 0}, c = {1, 1, 1, 1};
auto is_one = [](auto x){ return x == 1; };
static_assert(!some_of(a, is_one) && some_of(b, is_one) && !some_of(c, is_one));

int main()
{
    const auto v = {0, 1, 2, 3, 40, 40, 41, 41, 5}; /*
                                ^^          ^^       */
    namespace ranges = std::ranges;

    if (auto it = ranges::adjacent_find(v.begin(), v.end()); it == v.end())
        std::cout << "No matching adjacent elements\n";
    else
        std::cout << "The first adjacent pair of equal elements is at ["
                  << ranges::distance(v.begin(), it) << "] == " << *it << '\n';

    if (auto it = ranges::adjacent_find(v, ranges::greater()); it == v.end())
        std::cout << "The entire vector is sorted in ascending order\n";
    else
        std::cout << "The last element in the non-decreasing subsequence is at ["
                  << ranges::distance(v.begin(), it) << "] == " << *it << '\n';
}

Вывод:

The first adjacent pair of equal elements is at [4] == 40
The last element in the non-decreasing subsequence is at [7] == 41

Смотри также

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