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 >
inline 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 — это адаптер диапазона, который принимает view и генерирует view, где i-й элемент (окно) является 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, -
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 тип моделирует соответствующую концепцию.
Члены данных
| Объект-член | Определение |
|---|---|
base_ (private) | базовый view типа V.(только для иллюстрации*) |
Члены-функции
|
(C++23) | создаёт adjacent_view (публичная функция-член) |
|
(C++23) | возвращает итератор в начало (публичная функция-член) |
|
(C++23) | возвращает итератор или конечную точку в конец (публичная функция-член) |
|
(C++23) | возвращает количество элементов. Предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range. (публичная функция-член) |
Наследуется от |
|
|
(C++20) | возвращает, пуст ли производный диапазон. Предоставляется, если он удовлетворяет sized_range или forward_range. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает постоянный итератор в начало диапазона. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает конечную точку постоянного итератора диапазона. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает, не пуст ли производный диапазон. Предоставляется, если ranges::empty применимо к нему. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент в производном диапазоне. Предоставляется, если он удовлетворяет forward_range. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент в производном диапазоне. Предоставляется, если он удовлетворяет bidirectional_range и common_range. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает n-й элемент в производном диапазоне. Предоставляется, если он удовлетворяет random_access_range. (публичная функция-член std::ranges::view_interface<D>) |
Правила вывода
(нет)
Вложенные классы
|
(C++23) | тип итератора (только для иллюстрации*) |
|
(C++23) | тип конечной точки, используемый, когда adjacent_view не является common_range(только для иллюстрации*) |
Вспомогательные шаблоны
template< class V, size_t N >
inline 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, когда базовый диапазон удовлетворяет ему.
Примечания
Существует сходство между 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 | range | Параметр выполнения |
| Макрокоманда проверки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_zip | 202110L | (C++23) |
std::ranges::zip_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++23 (ISO/IEC 14882:2023):
- 26.7.25 Соседнее представление [range.adjacent]
См. также
|
(C++23) | представление, состоящее из кортежей результатов применения функции преобразования к соседним элементам адаптированного представления (шаблон класса) (объект адаптера диапазона) |
|
(C++23) | представление, чьим M-м элементом является представление элементов с M-го по (M + N - 1)-й элементы другого представления (шаблон класса) (объект адаптера диапазона) |
|
(C++23) | диапазон представлений, которые являются непересекающимися блоками последовательных элементов заданного размера другого представления (шаблон класса) (объект адаптера диапазона) |
|
(C++23) | представление, состоящее из элементов другого представления, перемещающегося на N элементов за раз (шаблон класса) (объект адаптера диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/adjacent_view