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) | (только для экспозиции*) |
slide_view — это адаптер диапазона, который принимает view и число n и создаёт представление, каждый mth элемент которого («окно») является представлением [m, m + n - 1] элементов исходного представления.s — размер исходного представления. Тогда размер созданного представления равен: -
s - n + 1, еслиs >= n, -
0в противном случае, и результирующее представление пусто.
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 (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или sentinel на конец (открытая функция-член) |
|
возвращает количество элементов; предоставляется только если базовый (адаптированный) диапазон удовлетворяет концепту 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) | возвращает sentinel для константного итератора диапазона (открытая функция-член класса 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>) |
|
Руководства по выводу типов
Вложенные классы
|
(C++23) | тип итератора (шаблон класса-члена, используемый только для экспозиции*) |
|
(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]
См. также
|
(C++23) | view, состоящее из кортежей ссылок на соседние элементы адаптированного представления(шаблон класса) (объект-адаптер диапазона) |
|
(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