Spec-Zone.ru › C++

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​ в противном случае, и результирующий диапазон пустой.
2) Имя 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
(публичная функция-член)
begin
(C++23)
возвращает итератор в начало
(публичная функция-член)
end
(C++23)
возвращает итератор или конечную точку в конец
(публичная функция-член)
size
(C++23)
возвращает количество элементов. Предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range.
(публичная функция-член)
Наследуется от std::ranges::view_interface
empty
(C++20)
возвращает, пуст ли производный диапазон. Предоставляется, если он удовлетворяет sized_range или forward_range.
(публичная функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает постоянный итератор в начало диапазона.
(публичная функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает конечную точку постоянного итератора диапазона.
(публичная функция-член std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пуст ли производный диапазон. Предоставляется, если ranges::empty применимо к нему.
(публичная функция-член std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном диапазоне. Предоставляется, если он удовлетворяет forward_range.
(публичная функция-член std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном диапазоне. Предоставляется, если он удовлетворяет bidirectional_range и common_range.
(публичная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-й элемент в производном диапазоне. Предоставляется, если он удовлетворяет random_access_range.
(публичная функция-член std::ranges::view_interface<D>)

Правила вывода

(нет)

Вложенные классы

iterator
(C++23)
тип итератора
(только для иллюстрации*)
sentinel
(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.
END_OF_DOCUMENT_MARKER

Различия между этими адаптерами:

Адаптер представления value_type Размер окна N
ranges::adjacent_view Объект std::tuple Шаблонный параметр
ranges::slide_view range Параметр выполнения
Макрокоманда проверки функции Значение Стандарт Функция
__cpp_lib_ranges_zip 202110L (C++23) std::ranges::zip_view,

std::ranges::zip_transform_view,
std::ranges::adjacent_view,
std::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++23 (ISO/IEC 14882:2023):
    • 26.7.25 Соседнее представление [range.adjacent]

См. также

ranges::adjacent_transform_viewviews::adjacent_transform
(C++23)
представление, состоящее из кортежей результатов применения функции преобразования к соседним элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона)
ranges::slide_viewviews::slide
(C++23)
представление, чьим M-м элементом является представление элементов с M-го по (M + N - 1)-й элементы другого представления
(шаблон класса) (объект адаптера диапазона)
ranges::chunk_viewviews::chunk
(C++23)
диапазон представлений, которые являются непересекающимися блоками последовательных элементов заданного размера другого представления
(шаблон класса) (объект адаптера диапазона)
ranges::stride_viewviews::stride
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API