Namespaces
Variants

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

С ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определено в заголовке <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 — это адаптер диапазона, который принимает представление, и создает представление, чей ith элемент (окно) является std::tuple, который содержит N ссылки на элементы [i, i + N - 1] исходного представления.
Пусть S — размер исходного представления. Тогда размер полученного представления равен:
  • S - N + 1, если S >= N,
  • 0 иначе результирующее представление пусто.
2) Имя views::adjacent<N> обозначает RangeAdaptorObject. Дано подвыражение 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 обозначает RangeAdaptorObject которое ведет себя в точности как views::adjacent<2>.

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

Члены данных

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

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

создает adjacent_view
(публичная функция-член)
возвращает итератор на начало
(публичная функция-член)
возвращает итератор или страж на конец
(публичная функция-член)
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range
(публичная функция-член)
возвращает приблизительный размер результирующего approximately_sized_range
(публичная функция-член)
Унаследовано от ranges::view_interface
возвращает, является ли производное представление пустым, только если оно удовлетворяет sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
(C++23)
возвращает ограничитель для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
возвращает, является ли производное представление непустым, только если ranges::empty применима к нему
(открытая функция-член std::ranges::view_interface<D>)
возвращает первый элемент в производном представлении, если оно удовлетворяет forward_range
(открытая функция-член std::ranges::view_interface<D>)
возвращает последний элемент в производном представлении, только если оно удовлетворяет bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
возвращает n-й элемент в производном представлении, только если оно удовлетворяет random_access_range
(открытая функция-член std::ranges::view_interface<D>)

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

(нет)

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

тип итератора
( демонстрационный шаблон класса-члена* )
тип 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 принимает только forward ranges, даже когда 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 <array>
#include <format>
#include <iostream>
#include <ranges>
#include <tuple>
int main()
{
    constexpr std::array v{1, 2, 3, 4, 5, 6};
    std::cout << "v = [1 2 3 4 5 6]\n";
    for (int i{}; std::tuple t : v | std::views::adjacent<3>)
    {
        auto [t0, t1, t2] = t;
        std::cout << std::format("e = {:<{}}[{} {} {}]\n", "", 2 * 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++.

DR Applied to Behavior as published Correct behavior
LWG 4098 C++23 views :: adjacent < 0 > принимал диапазоны только для чтения отклоняется

Ссылки

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

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

представление, view состоящее из результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона)
представление, view M-й элемент которого является view над M-м по (M + N - 1)-й элементы другого view
(шаблон класса) (объект адаптера диапазона)
диапазон view s , которые являются N -размерными неперекрывающимися последовательными блоками элементов другого view
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из элементов другого view , продвигающееся по N элементов за раз
(шаблон класса) (объект адаптера диапазона)