std::ranges::views::stride, std::ranges::stride_view
Определено в заголовочном файле <ranges> | ||
|---|---|---|
template< ranges::input_range V >
requires ranges::view<V>
class stride_view
: public ranges::view_interface<stride_view<V>>
| (1) | (начиная с C++23) |
namespace views {
inline constexpr /* unspecified */ stride = /* unspecified */;
}
| (2) | (начиная с C++23) |
| Сигнатура вызова | ||
template< ranges::viewable_range R > constexpr ranges::view auto stride( R&& r, ranges::range_difference_t<R> n ); | (начиная с C++23) | |
template< class DifferenceType > constexpr /*range adaptor closure*/ stride( DifferenceType&& n ); | (начиная с C++23) | |
| Вспомогательные шаблоны |
1)
Пусть stride_view — это адаптер диапазона, который принимает view и число n и создает представление, состоящее из элементов исходного представления с переходом через n элементов за раз. Это означает, что каждый m-й элемент созданного представления является (n * i)-м элементом исходного представления для некоторого неотрицательного индекса i. Элементы исходного представления, чей «индекс» не кратен n, в созданное представление не входят.S — размер исходного представления. Тогда размер созданного представления равен: -
(S / n) + (S % n ? 1 : 0), еслиS >= n; в противном случае -
1, еслиS > 0; в противном случае -
0, и результирующее представление пусто.
2) Имя
views::stride обозначает объект-адаптер диапазона. Для подвыражений e и n выражение views::stride(e, n) эквивалентно выражению stride_view(e, n).
Значение
n должно быть больше 0, иначе поведение не определено.stride_view всегда моделирует input_range и моделирует forward_range, bidirectional_range, random_access_range и/или sized_range, если тип адаптированного view V моделирует соответствующую концепцию. stride_view<V> моделирует common_range, если базовое представление V моделирует эту концепцию.
Поля данных
| Поле | Описание |
|---|---|
V base_ | базовое представление (служебный объект-член*) |
ranges::range_difference_t<V> stride_ | объект размера («шаг») (служебный объект-член*) |
Функции-члены
создает stride_view (открытая функция-член) |
|
|
(C++23) | возвращает сохраненное значение шага (открытая функция-член) |
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или сентинел конца (открытая функция-член) |
|
возвращает число элементов; доступна только если базовый (адаптированный) диапазон удовлетворяет концепции 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) | возвращает сентинел для константного итератора диапазона (открытая функция-член 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) | тип итератора (служебный шаблон класса-члена*) |
Вспомогательные шаблоны
template< class V >
constexpr bool ranges::enable_borrowed_range<stride_view<V>> =
ranges::enable_borrowed_range<V>;
| (начиная с C++23) |
Эта специализация ranges::enable_borrowed_range позволяет stride_view удовлетворять концепции borrowed_range, если ей удовлетворяет базовое представление.
Примечания
| Макрос проверки поддержки возможности | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges_stride | 202207L | (C++23) |
std::ranges::stride_view |
Пример
#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
using namespace std::literals;
void print(std::ranges::viewable_range auto&& v, std::string_view separator = " ")
{
for (auto const& x : v)
std::cout << x << separator;
std::cout << '\n';
}
int main()
{
print(std::views::iota(1, 13) | std::views::stride(3));
print(std::views::iota(1, 13) | std::views::stride(3) | std::views::reverse);
print(std::views::iota(1, 13) | std::views::reverse | std::views::stride(3));
print("0x0!133713337*x//42/A$@"sv | std::views::stride(0B11) |
std::views::transform([](char O) -> char { return 0100 | O; }),
"");
}
Вывод:
1 4 7 10 10 7 4 1 12 9 6 3 password
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 26.7.31 Представление с шагом [range.stride]
См. также
|
(C++23) | представление view, M-й элемент которого является view над элементами с M-го по (M + N - 1)-й другого view(шаблон класса) (объект-адаптер диапазона) |
|
(C++23) | диапазон из views, представляющих собой последовательные неперекрывающиеся фрагменты элементов другого view размером N(шаблон класса) (объект-адаптер диапазона) |
|
(C++23) | представление view, состоящее из кортежей ссылок на соседние элементы адаптированного представления(шаблон класса) (объект-адаптер диапазона) |
|
(C++20) | представление view, состоящее из элементов range, удовлетворяющих предикату(шаблон класса) (объект-адаптер диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/stride_view