Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
adjacent_view views::adjacent
(C++23) (C++23)
views::pairwise
(C++23)

Определено в заголовочном файле <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 /* неспецифицировано */ adjacent = /* неспецифицировано */ ;

}
(2) (начиная с C++23)
namespace views {

inline constexpr auto pairwise = adjacent < 2 > ;

}
(3) (начиная с C++23)
Сигнатура вызова
template < ranges:: viewable_range R >

requires /* см. ниже */

constexpr ranges:: view auto adjacent < N > ( R && r ) ;
(начиная с C++23)
1) adjacent_view — это адаптер диапазона, который принимает view и создаёт view , чей i элемент (так называемое "окно") представляет собой 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 , если адаптированный view моделирует соответствующую концепцию.

Содержание

Члены данных

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

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

создает adjacent_view
(публичная функция-член)
возвращает итератор на начало
(публичная функция-член)
возвращает итератор или страж на конец
(публичная функция-член)
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range
(публичная функция-член)
возвращает приблизительный размер результирующего approximately_sized_range
(публичная функция-член)
Наследуется от std::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 элементов за раз
(шаблон класса) (объект адаптера диапазона)