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 обозначает RangeAdaptorObject. Учитывая подвыражения 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 моделирует соответствующее понятие.
Члены данных
| Объект-член | Определение |
|---|---|
base_ (private) | Базовое view типа V.(объект-член, только для иллюстрации*) |
stride_ (private) | Объект размера (шаг) типа ranges::range_difference_t<V>.(объект-член, только для иллюстрации*) |
Члены-функции
|
(C++23) | создаёт stride_view (публичная функция-член) |
|
(C++23) | возвращает сохранённое значение шага (публичная функция-член) |
|
(C++23) | возвращает копию базового (адаптированного) представления (публичная функция-член) |
|
(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) | возвращает последний элемент в производном представлении. Предоставляется, если оно удовлетворяет bidirectional_range и common_range. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает n-й элемент в производном представлении. Предоставляется, если оно удовлетворяет random_access_range. (публичная функция-член std::ranges::view_interface<D>) |
Руководства по выводу
Вложенные классы
|
(C++23) | тип итератора (вложенный шаблон класса, только для иллюстрации*) |
Вспомогательные шаблоны
template< class V >
inline constexpr bool ranges::enable_borrowed_range<stride_view<V>> =
ranges::enable_borrowed_range<V>;
| (с C++23) |
Это специализация ranges::enable_borrowed_range, которая позволяет 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:2023):
- 26.7.31 Вид с шагом [range.stride]
См. также
|
(C++23) | вид view, чей M-ый элемент — view над элементами с M-ого по (M + N - 1)-ый другого view(шаблон класса) (объект адаптера диапазона) |
|
(C++23) | диапазон view неперекрывающихся кусков элементов другого 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/w/cpp/ranges/stride_view