std::ranges...::slide_view(3)

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

πŸ’– NAME πŸ’–

okay bestie, this is the std::ranges...::slide_view(3) page from the C++ Standard Libary manual, and we are about to make sliding windows feel like main character energy ✨

The names are std::ranges::views::slide,std::ranges::slide_view β€” and the short description is literally the same thing again: std::ranges::views::slide,std::ranges::slide_view πŸ’…


✨ Synopsis ✨

Defined in header <ranges> β€” yes, that's right, bestie 🫢

template< ranges::forward_range V >
    requires ranges::view<V>                                  (1)
(since C++23)
class slide_view
    : public ranges::view_interface<slide_view<V>>
namespace views {

    inline constexpr /* unspecified */ slide = /* unspecified (2)
(since C++23)
*/;

}

πŸ“ž Call signature πŸ“ž

template< ranges::viewable_range R >
constexpr ranges::view auto slide( R&& r,
(since C++23)
ranges::range_difference_t<R> n );
template< class DifferenceType >
constexpr /* range adaptor object */ slide( DifferenceType&&
(since C++23)
n );

🧠 Helper concepts 🧠

template< class V >

concept __slide_caches_nothing =                              (3)
(exposition only*)

    ranges::random_access_range<V> && ranges::sized_range<V>;
template< class V >

concept __slide_caches_last =
    !__slide_caches_nothing<V> &&                             (4)
(exposition only*)

    ranges::bidirectional_range<V> &&
ranges::common_range<V>;
template< class V >

concept __slide_caches_first =                                (5)
(exposition only*)

    !__slide_caches_nothing<V> && !__slide_caches_last<V>;
  1. slide_view is a range adaptor that takes a view and a number n and produces a view whose m ^th element (a "window") is a view over the m ^th through (m + n - 1) ^th elements of the original view. Let s be the size of the original view. Then the size of the produced view is:
    • s - n + 1, if s >= n,
    • 0 otherwise, and the resulting view is empty.
  2. The name views::slide denotes a RangeAdaptorObject. Given subexpressions e and n, the expression views::slide(e, n) is expression-equivalent to slide_view(e, n).
🚨 If n is not greater than 0, the behavior is undefined. 🚨

slide_view always models forward_range, and models bidirectional_range, random_access_range, or sized_range if the adapted view type models the corresponding concept. no cap ✨


πŸ› οΈ Member functions πŸ› οΈ

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

🫢 Inherited from std::ranges::view_interface 🫢

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

🧭 Deduction guides 🧭

The original page has this heading, but no extra deduction-guide details are spelled out underneath it here β€” so we are not inventing any, bestie. periodt πŸ’…


πŸͺ† Nested classes πŸͺ†

  • iterator β€” the iterator type. (C++23) (exposition-only member class template*).
  • sentinel β€” the sentinel type used when slide_view is not a common_range. (C++23) (exposition-only member class template*).

🧰 Helper templates 🧰

template< class V >

inline constexpr bool ranges::enable_borrowed_range<slide_view<V>> =
(since C++23)

    ranges::enable_borrowed_range<V>;

This specialization of ranges::enable_borrowed_range makes slide_view satisfy borrowed_range when the underlying view satisfies it. iconic behavior honestly 🌈


πŸ“ Notes πŸ“

There are similarities between ranges::adjacent_view and ranges::slide_view:

  • Both create a "sliding window" of size N.
  • Both have the same size S - N + 1, where S is the size of an adapted view such that S >= N > 0.

The differences between these adapters are:

  • ranges::adjacent_view β€” value_type: A std::tuple object. The window size N: A template parameter.
  • ranges::slide_view β€” value_type: A range. The window size N: A runtime parameter.

Feature-test macro:

  • __cpp_lib_ranges_slide β€” value 202202L, std (C++23), feature std::ranges::slide_view.

🌟 Example 🌟

// Run this code

#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';
    }
}

πŸ’» Output πŸ’»

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]

πŸ“š References πŸ“š

  • C++23 standard (ISO/IEC 14882:2023):
  • 26.7.29 Slide view [range.slide]

πŸ‘€ See also πŸ‘€

  • ranges::adjacent_view β€” a view consisting of tuples of references to adjacent elements of the adapted view.
  • views::adjacent β€” (C++23) (class template) (range adaptor object).
  • ranges::chunk_view β€” a range of views that are N-sized non-overlapping successive chunks of the elements of another view.
  • views::chunk β€” (C++23) (class template) (range adaptor object).

okay that's the whole page, bestie β€” source/version and date sign-off: http://cppreference.com, 2024.06.10, and page std::ranges...::slide_view(3). slay, go build some windows πŸ’…βœ¨

πŸ“¦ where this page comes from