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 и генерирует представление, у которого m-ый элемент («окно») представляет собой представление, содержащее элементы с 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 и моделирует двунаправленный диапазон, случайный доступный диапазон или размерный диапазон, если адаптированный view тип моделирует соответствующую концепцию.
Члены данных
| Объект-член | Определение |
|---|---|
base_ (private) | Базовое view типа V.(только для демонстрации*) |
n_ (private) | Размер «окна» типа ranges::range_difference_t<V>. (только для демонстрации*) |
cached_begin_ (private) (необязательно) | Объект-аналог необязательного объекта. Присутствует только если V моделирует __slide_caches_first (4).(только для демонстрации*) |
cached_end_ (private) (необязательно) | Объект-аналог необязательного объекта. Присутствует только если V моделирует __slide_caches_last (5).(только для демонстрации*) |
Члены-функции
|
(C++23) | создаёт slide_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) | возвращает последний элемент производного представления. Предоставляется, если оно удовлетворяет двунаправленному диапазону и common_range. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает n-ый элемент производного представления. Предоставляется, если оно удовлетворяет случайному доступу. (публичная функция-член std::ranges::view_interface<D>) |
Руководства по выводу типов
Вложенные классы
|
(C++23) | тип итератора (только для демонстрации, шаблон класса-члена*) |
|
(C++23) | тип стоп-итератора, используемый, когда slide_view не является common_range(только для демонстрации, шаблон класса-члена*) |
Вспомогательные шаблоны
template< class V >
inline 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 | range
| параметр во время выполнения |
| Макрос проверки наличия функции | Значение | Std | Функция |
|---|---|---|---|
__cpp_lib_ranges_slide | 202202L | (C++23) |
std::ranges::slide_view |
Пример
#include <algorithm>
#include <iostream>
#include <ranges>
auto print_subrange = [](std::ranges::viewable_range auto&& r)
{
std::cout << '[';
for (char space[]{0,0}; auto elem : r)
std::cout << space << elem, *space = ' ';
std::cout << "] ";
};
int main()
{
const auto v = {1, 2, 3, 4, 5, 6};
std::cout << "All sliding windows of width:\n";
for (const unsigned width : std::views::iota(1U, 1U + v.size()))
{
auto const windows = v | std::views::slide(width);
std::cout << "W = " << width << ": ";
std::ranges::for_each(windows, print_subrange);
std::cout << '\n';
}
}Вывод:
All sliding windows of width W: 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++23 (ISO/IEC 14882:2023):
- 26.7.29 Вид слайда [range.slide]
См. также
|
(C++23) | view содержащий кортежи ссылок на смежные элементы адаптированного представления(шаблон класса) (объект адаптера диапазона) |
|
(C++23) | диапазон view, состоящий из кусков последовательных элементов без перекрытия размера N из другого view(шаблон класса) (объект адаптера диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/slide_view