Spec-Zone.ru › C++

std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise

Определён в заголовочном файле <ranges>
template< ranges::forward_range V, std::size_t N >
    requires ranges::view<V> && (N > 0)
class adjacent_view
    : public ranges::view_interface<adjacent_view<V, N>>
(1) (начиная с C++23)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ adjacent = /* unspecified */ ;
}
(2) (начиная с C++23)
namespace views {
    inline constexpr auto pairwise = adjacent<2>;
}
(3) (начиная с C++23)
Сигнатура вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto adjacent<N>( R&& r );
(начиная с C++23)
1) adjacent_view — адаптер диапазона, который принимает view и создаёт view, у которого ith элемент («окно») — это std::tuple, содержащее N ссылок на элементы [i, i + N - 1] исходного представления.
Пусть S — размер исходного представления. Тогда размер созданного представления равен:
  • S - N + 1, если S >= N,
  • 0 в противном случае, а результирующее представление пусто.
2) Имя views::adjacent<N> обозначает объект-адаптер диапазона. Для подвыражения e и константного выражения N выражение views::adjacent<N>(e) эквивалентно выражению
  • ((void)e, auto(views::empty<tuple<>>)), если N равно 0 и decltype((e)) моделирует forward_range,
  • adjacent_view<views::all_t<decltype((e))>, N>(e) в противном случае.
3) Имя views::pairwise обозначает объект-адаптер диапазона, который ведёт себя точно так же, как views::adjacent<2>.

adjacent_view всегда моделирует forward_range, а также моделирует bidirectional_range, random_access_range или sized_range, если тип адаптированного view моделирует соответствующую концепцию.

Поля данных

Член Описание
V base_ базовое view
(объект-член, используемый только для описания*)

Функции-члены

(конструктор)
создаёт adjacent_view
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или сентинел на конец
(открытая функция-член)
size
возвращает количество элементов; доступна только в том случае, если базовый (адаптированный) диапазон удовлетворяет концепции sized_range
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер результирующего approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; доступна только в том случае, если оно удовлетворяет концепции sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает сентинел для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает признак того, что производное представление не пусто; доступна только в том случае, если к нему применима ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления при условии, что оно удовлетворяет концепции forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; доступна только в том случае, если оно удовлетворяет концепциям bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает nth элемент производного представления; доступна только в том случае, если оно удовлетворяет концепции random_access_range
(открытая функция-член std::ranges::view_interface<D>)

Руководства по выводу типов

(отсутствуют)

Вложенные классы

iterator
тип итератора
(шаблон класса-члена, используемый только для описания*)
sentinel
тип сентинела, используемый, когда adjacent_view не является common_range
(шаблон класса-члена, используемый только для описания*)

Вспомогательные шаблоны

template< class V, size_t N >
constexpr bool ranges::enable_borrowed_range<adjacent_view<V, N>> =
    ranges::enable_borrowed_range<V>;
(начиная с C++23)

Эта специализация ranges::enable_borrowed_range позволяет adjacent_view удовлетворять концепции borrowed_range, если ей удовлетворяет базовое представление.

Примечания

views::adjacent принимает только диапазоны прямого доступа, даже если N равно 0.

Между ranges::adjacent_view и ranges::slide_view есть сходство:

  • Оба создают «скользящее окно» размером N.
  • Оба имеют одинаковый размер S - N + 1, где S — размер адаптированного view, такого что S >= N > 0.

В таблице ниже показаны различия между этими адаптерами:

Адаптер представления value_type Размер окна N
ranges::adjacent_view std::tuple Параметр шаблона
ranges::slide_view ranges::range Аргумент времени выполнения
Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_zip 202110L (C++23) ranges::zip_view,
ranges::zip_transform_view,
ranges::adjacent_view,
ranges::adjacent_transform_view

Пример

#include <print>
#include <ranges>
#include <tuple>

int main()
{
    static constexpr auto v = {1, 2, 3, 4, 5, 6};
    std::println("v = {}", v);

    for (int i{}; std::tuple t : v | std::views::adjacent<3>)
    {
        const auto [t0, t1, t2] = t;
        std::println("e = {:<{}}[{}, {}, {}]", "", 3 * i++, t0, t1, t2);
    }
}

Вывод:

v = [1, 2, 3, 4, 5, 6]
e = [1, 2, 3]
e =    [2, 3, 4]
e =       [3, 4, 5]
e =          [4, 5, 6]

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 3848 C++23 adjacent_view не предоставляет метод доступа base() добавлен
LWG 4098 C++23 views::adjacent<0> ранее принимал диапазоны только с входным итератором приём запрещён

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 26.7.25 Соседнее представление [range.adjacent]

См. также

ranges::adjacent_transform_viewviews::adjacent_transform
(C++23)
view, состоящее из результатов применения функции преобразования к соседним элементам адаптированного представления
(шаблон класса) (объект-адаптер диапазона)
views::pairwise_transform
(C++23)
view, состоящее из результатов применения функции преобразования к каждой паре соседних элементов адаптированного представления
(объект точки настройки)
ranges::slide_viewviews::slide
(C++23)
view, у которого Mth элемент — это view над элементами с Mth по (M + N - 1)th другого view
(шаблон класса) (объект-адаптер диапазона)
ranges::chunk_viewviews::chunk
(C++23)
диапазон из views — последовательных неперекрывающихся фрагментов элементов другого view размером N
(шаблон класса) (объект-адаптер диапазона)
ranges::stride_viewviews::stride
(C++23)
view, состоящее из элементов другого view с переходом через N элементов за раз
(шаблон класса) (объект-адаптер диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/adjacent_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API