std::ranges...:stride_view(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

✨ NAME ✨

okay so bestie, this is the C++ Standard Libary manual page for std::ranges::views::stride and std::ranges::stride_view β€” yes, both names, because the page title is literally std::ranges::views::stride,std::ranges::stride_view. It’s giving β€œrange adaptor with two names and zero chill” πŸ’…


🌸 Synopsis 🌸

Defined in header <ranges>.

template< ranges::input_range V >
    requires ranges::view<V>
class stride_view
    : public ranges::view_interface<stride_view<V>>

That first one is (1) and it’s (since C++23) ✨

namespace views {
    inline constexpr /* unspecified */ stride = /* unspecified */;
}

That second one is (2) and it’s also (since C++23) πŸ’–

πŸ“ž Call signature πŸ“ž

template< ranges::viewable_range R >
constexpr ranges::view auto stride( R&& r,
    ranges::range_difference_t<R> n );

(since C++23) 🫢

template< class DifferenceType >
constexpr /*range adaptor closure*/ stride( DifferenceType&& n );

(since C++23) ⭐

🧩 Helper templates 🧩

  1. stride_view is a range adaptor that takes a view and a number n and produces a view that consists of elements of the original view by advancing over n elements at a time. This means that each m^th element of the produced view is (n * i)^th element of the original view, for some non-negative index i. The elements of the original view whose β€œindex” is not a multiple of n are not present in the produced view.

Let S be the size of the original view. Then the size of produced view is:

  • (S / n) + (S % n ? 1 : 0), if S >= n; otherwise,
  • 1, if S > 0; otherwise,
  • 0, and the resulting view is empty.
  1. The name views::stride denotes a RangeAdaptorObject. Given subexpressions e and n, the expression views::stride(e, n) is expression-equivalent to stride_view(e, n).
⚠️ serious caveat, bestie: The n must be greater than 0, otherwise the behavior is undefined. That is not a vibe. That is UB territory πŸ’€

stride_view always models input_range, and models forward_range, bidirectional_range, random_access_range, and/or sized_range, if adapted view type V models the corresponding concept. stride_view<V> models common_range whenever the underlying view V does. no cap πŸ‘‘


πŸ’– Member functions πŸ’–

  • constructor (C++23) β€” constructs a stride_view (public member function)
  • stride (C++23) β€” returns the stored stride value (public member function)
  • base (C++23) β€” returns a copy of the underlying (adapted) view (public member function)
  • begin (C++23) β€” returns an iterator to the beginning (public member function)
  • end (C++23) β€” returns an iterator or a sentinel to the end (public member function)
  • size (C++23) β€” returns the number of elements. Provided only if the underlying (adapted) range satisfies sized_range. (public member function)

🫢 Inherited from std::ranges::view_interface 🫢

  • empty (C++20) β€” returns whether the derived view is empty. Provided if it satisfies sized_range or forward_range. (public member function of std::ranges::view_interface<D>)
  • cbegin (C++23) β€” returns a constant iterator to the beginning of the range. (public member function of std::ranges::view_interface<D>)
  • cend (C++23) β€” returns a sentinel for the constant iterator of the range. (public member function of std::ranges::view_interface<D>)
  • operator bool (C++20) β€” returns whether the derived view is not empty. Provided if ranges::empty is applicable to it. (public member function of std::ranges::view_interface<D>)
  • front (C++20) β€” returns the first element in the derived view. Provided if it satisfies forward_range. (public member function of std::ranges::view_interface<D>)
  • back (C++20) β€” returns the last element in the derived view. Provided if it satisfies bidirectional_range and common_range. (public member function of std::ranges::view_interface<D>)
  • operator[] (C++20) β€” returns the n^th element in the derived view. Provided if it satisfies random_access_range. (public member function of std::ranges::view_interface<D>)

πŸŽ€ Deduction guides πŸŽ€

The page has the heading here, but no deduction guides are listed β€” iconic minimalism, I guess πŸŽ€


πŸ¦‹ Nested classes πŸ¦‹

  • iterator (C++23) β€” the iterator type (exposition-only member class template*)

🧚 Helper templates 🧚

template< class V >
inline constexpr bool ranges::enable_borrowed_range<stride_view<V>> =
    ranges::enable_borrowed_range<V>;

(since C++23) ✨

This specialization of ranges::enable_borrowed_range makes stride_view satisfy borrowed_range when the underlying view satisfies it. borrowed-range behavior: slay 🫢


πŸ’œ Notes πŸ’œ

  • Feature-test macro: __cpp_lib_ranges_stride β€” value 202207L, standard (C++23), feature std::ranges::stride_view πŸ’œ

πŸ“ Example πŸ“

// Run this code

#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; }),
          "");
}

🌈 Output 🌈

1 4 7 10
10 7 4 1
12 9 6 3
password

πŸ‘‘ References πŸ‘‘

  • C++23 standard (ISO/IEC 14882:2023):
    • 26.7.31 Stride view [range.stride] πŸ‘‘

🌟 See also 🌟

  • ranges::slide_view, views::slide (C++23) β€” a view whose M^th element is a view over the M^th through (M + N - 1)^th elements of another view (class template) (range adaptor object)
  • ranges::chunk_view, views::chunk (C++23) β€” a range of views that are N-sized non-overlapping successive chunks of the elements of another view (class template) (range adaptor object)
  • ranges::adjacent_view, views::adjacent (C++23) β€” a view consisting of tuples of references to adjacent elements of the adapted view (class template) (range adaptor object)
  • ranges::filter_view, views::filter (C++20) β€” a view that consists of the elements of a range that satisfies a predicate (class template) (range adaptor object)

πŸ’– source/version/date sign-off, bestie: http://cppreference.com Β· 2024.06.10 Β· page std::ranges...:stride_view(3) β€” go forth and stride responsibly πŸ’…βœ¨πŸŒΈ

πŸ“¦ where this page comes from