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