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
)
|
(1) | (начиная с C++23) |
|
namespace
views
{
template
<
std::
size_t
N
>
|
(2) | (начиная с C++23) |
|
namespace
views
{
inline
constexpr
auto
pairwise
=
adjacent
<
2
>
;
|
(3) | (начиная с C++23) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* см. ниже */
|
(начиная с C++23) | |
adjacent_view
— это адаптер диапазона, который принимает
view
и создаёт
view
, чей
i
-й
элемент (так называемое "окно") представляет собой
std::tuple
, содержащий
N
ссылок на элементы
[
i
,
i + N - 1
]
исходного представления.
S
будет размером исходного представления. Тогда размер созданного представления равен:
-
S
-
N
+
1
, если
S >= N, - 0 в противном случае, и результирующее представление пусто.
-
(
(
void
)
e,
auto
(
views::
empty
<
tuple
<>>
)
)
если
N
равно
0
и
decltype
(
(
e
)
)
моделирует
forward_range, - adjacent_view < views:: all_t < decltype ( ( e ) ) > , N > ( e ) в остальных случаях.
adjacent_view
всегда моделирует
forward_range
и моделирует
bidirectional_range
,
random_access_range
или
sized_range
, если адаптированный
view
моделирует соответствующую концепцию.
Содержание |
Члены данных
| Участник | Описание |
V
base_
|
базовый
view
( объект-член только для демонстрации* ) |
Функции-члены
создает
adjacent_view
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
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
>>
=
|
(начиная с 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 элементов за раз
(шаблон класса) (объект адаптера диапазона) |