Spec-Zone.ru › C++

std::ranges::views::slide, std::ranges::slide_view

Определён в заголовочном файле <ranges>
template< ranges::forward_range V >
    requires ranges::view<V>
class slide_view
    : public ranges::view_interface<slide_view<V>>
(1) (начиная с C++23)
namespace views {
    inline constexpr /* unspecified */ slide = /* unspecified */;
}
(2) (начиная с C++23)
Сигнатура вызова
template< ranges::viewable_range R >
constexpr ranges::view auto slide( R&& r, ranges::range_difference_t<R> n );
(начиная с C++23)
template< class DifferenceType >
constexpr /* range adaptor object */ slide( DifferenceType&& n );
(начиная с C++23)
Вспомогательные концепты
template< class V >
concept /*slide-caches-nothing*/ =
    ranges::random_access_range<V> && ranges::sized_range<V>;
(3) (только для экспозиции*)
template< class V >
concept /*slide-caches-last*/ =
    !/*slide-caches-nothing*/<V> &&
    ranges::bidirectional_range<V> && ranges::common_range<V>;
(4) (только для экспозиции*)
template< class V >
concept /*slide-caches-first*/ =
    !/*slide-caches-nothing*/<V> && !/*slide-caches-last*/<V>;
(5) (только для экспозиции*)
1) slide_view — это адаптер диапазона, который принимает view и число n и создаёт представление, каждый mth элемент которого («окно») является представлением [m, m + n - 1] элементов исходного представления.
Пусть s — размер исходного представления. Тогда размер созданного представления равен:
  • s - n + 1, если s >= n,
  • 0 в противном случае, и результирующее представление пусто.
2) Имя views::slide обозначает объект RangeAdaptorObject. Для подвыражений e и n выражение views::slide(e, n) эквивалентно выражению slide_view(e, n).

Если n не превышает 0, поведение не определено.

slide_view всегда моделирует forward_range и моделирует bidirectional_range, random_access_range или sized_range, если тип адаптированного view моделирует соответствующий концепт.

Члены-данные

Член Описание
V base_ базовое представление
(объект-член, используемый только для экспозиции*)
ranges::range_difference_t<V> n_ размер «окна»
(объект-член, используемый только для экспозиции*)
non-propagating-cache<ranges::iterator_t<V>> cached_begin_
(присутствует только если V моделирует slide-caches-first)
объект, кэширующий результат begin()
(объект-член, используемый только для экспозиции*)
non-propagating-cache<ranges::iterator_t<V>> cached_end_
(присутствует только если V моделирует slide-caches-last)
объект, кэширующий результат end()
(объект-член, используемый только для экспозиции*)

Функции-члены

(конструктор)
создаёт slide_view
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или sentinel на конец
(открытая функция-член)
size
возвращает количество элементов; предоставляется только если базовый (адаптированный) диапазон удовлетворяет концепту sized_range
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер результирующего диапазона approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; предоставляется только если оно удовлетворяет концепту sized_range или forward_range
(открытая функция-член класса std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член класса std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для константного итератора диапазона
(открытая функция-член класса std::ranges::view_interface<D>)
operator bool
возвращает признак того, что производное представление не пусто; предоставляется только если к нему применим ranges::empty
(открытая функция-член класса std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет концепту forward_range
(открытая функция-член класса std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется только если оно удовлетворяет концептам bidirectional_range и common_range
(открытая функция-член класса std::ranges::view_interface<D>)
operator[]
возвращает n-й элемент производного представления; предоставляется только если оно удовлетворяет концепту random_access_range
(открытая функция-член класса std::ranges::view_interface<D>)

Руководства по выводу типов

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

iterator
(C++23)
тип итератора
(шаблон класса-члена, используемый только для экспозиции*)
sentinel
(C++23)
тип sentinel, используемый, когда slide_view не является common_range
(шаблон класса-члена, используемый только для экспозиции*)

Вспомогательные шаблоны

template< class V >
constexpr bool ranges::enable_borrowed_range<slide_view<V>> =
    ranges::enable_borrowed_range<V>;
(начиная с C++23)

Эта специализация ranges::enable_borrowed_range позволяет slide_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 ranges::range Аргумент времени выполнения
Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_slide 202202L (C++23) std::ranges::slide_view

Пример

#include <initializer_list>
#include <print>
#include <ranges>

int main()
{
    const auto v = {1, 2, 3, 4, 5, 6};
    
    std::println("All sliding windows of width:");
    for (const unsigned width : std::views::iota(1U, 1U + v.size()))
    {
        auto const windows = v | std::views::slide(width);
        std::println("W = {}: {}", width, windows);
    }
}

Вывод:

All sliding windows of width:
W = 1: [[1], [2], [3], [4], [5], [6]]
W = 2: [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
W = 3: [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
W = 4: [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
W = 5: [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]
W = 6: [[1, 2, 3, 4, 5, 6]]

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Опубликованное поведение Исправленное поведение
LWG 3848 C++23 slide_view не предоставляет функцию доступа base() добавлена

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 26.7.29 Представление slide [range.slide]

См. также

ranges::adjacent_viewviews::adjacent
(C++23)
view, состоящее из кортежей ссылок на соседние элементы адаптированного представления
(шаблон класса) (объект-адаптер диапазона)
ranges::chunk_viewviews::chunk
(C++23)
диапазон из views, представляющих собой N-размерные неперекрывающиеся последовательные фрагменты элементов другого view
(шаблон класса) (объект-адаптер диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/slide_view

Spec-Zone.ru

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