Spec-Zone.ru › C++

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
(публичная функция-член)
stride
(C++23)
возвращает сохранённое значение шага
(публичная функция-член)
base
(C++23)
возвращает копию базового (адаптированного) представления
(публичная функция-член)
begin
(C++23)
возвращает итератор начала
(публичная функция-член)
end
(C++23)
возвращает итератор или страж конца
(публичная функция-член)
size
(C++23)
возвращает количество элементов. Предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range.
(публичная функция-член)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, пусто ли производное представление. Предоставляется, если оно удовлетворяет sized_range или forward_range.
(публичная функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает постоянный итератор начала диапазона.
(публичная функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает страж для постоянного итератора диапазона.
(публичная функция-член std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пусто ли производное представление. Предоставляется, если ranges::empty применимо к нему.
(публичная функция-член std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном представлении. Предоставляется, если оно удовлетворяет forward_range.
(публичная функция-член std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном представлении. Предоставляется, если оно удовлетворяет bidirectional_range и common_range.
(публичная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-й элемент в производном представлении. Предоставляется, если оно удовлетворяет random_access_range.
(публичная функция-член std::ranges::view_interface<D>)

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

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

iterator
(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]

См. также

ranges::slide_viewviews::slide
(C++23)
вид view, чей M-ый элемент — view над элементами с M-ого по (M + N - 1)-ый другого view
(шаблон класса) (объект адаптера диапазона)
ranges::chunk_viewviews::chunk
(C++23)
диапазон view неперекрывающихся кусков элементов другого view, размера N,
(шаблон класса) (объект адаптера диапазона)
ranges::adjacent_viewviews::adjacent
(C++23)
view, состоящий из кортежей ссылок на смежные элементы адаптированного вида
(шаблон класса) (объект адаптера диапазона)
ranges::filter_viewviews::filter
(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

Spec-Zone.ru

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