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) | |
adjacent_view — это адаптер диапазона, который принимает представление, и создает представление, чей ith элемент (окно) является std::tuple, который содержит N ссылки на элементы [i, i + N - 1] исходного представления.S — размер исходного представления. Тогда размер полученного представления равен:
S - N + 1, еслиS >= N,0иначе результирующее представление пусто.
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)иначе.
views::pairwise обозначает RangeAdaptorObject которое ведет себя в точности как views::adjacent<2>.adjacent_view всегда моделирует forward_range, и моделирует bidirectional_range, random_access_range, или sized_range если адаптированное представление тип моделирует соответствующую концепцию.
Члены данных
| Участник | Описание |
V
base_
|
базовый
view
( объект-член только для демонстрации* ) |
Функции-члены
создает
adjacent_view
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
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
>>
=
|
(начиная с 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
состоящее из результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
представление,
view
M-й элемент которого является
view
над M-м по (M + N - 1)-й элементы другого
view
(шаблон класса) (объект адаптера диапазона) |
|
(C++23)
|
диапазон
view
s
, которые являются
N
-размерными неперекрывающимися последовательными блоками элементов другого
view
(шаблон класса) (объект адаптера диапазона) |
представление,
view
состоящее из элементов другого
view
, продвигающееся по N элементов за раз
(шаблон класса) (объект адаптера диапазона) |