Files
2025-10-25 03:02:53 +03:00

6.3 KiB
Raw Permalink Blame History

[range.reverse]

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.21 Reverse view [range.reverse]

25.7.21.1 Overview [range.reverse.overview]

1

#

reverse_view takes a bidirectional view and produces another view that iterates the same elements in reverse order.

2

#

The name views::reverse denotes a range adaptor object ([range.adaptor.object]).

Given a subexpression E, the expressionviews::reverse(E) is expression-equivalent to:

  • (2.1)

    If the type of E is a (possibly cv-qualified) specialization of reverse_view, then E.base().

  • (2.2)

    Otherwise, if the type of E is cv subrange<reverse_iterator, reverse_iterator, K> for some iterator type I and value K of type subrange_kind,

if K is subrange_kind::sized, thensubrange<I, I, K>(E.end().base(), E.begin().base(), E.size());

otherwise, subrange<I, I, K>(E.end().base(), E.begin().base()).

However, in either case E is evaluated only once.

  • (2.3)

    Otherwise, reverse_view{E}.

3

#

[Example 1: vector is {0,1,2,3,4};for (int i : is | views::reverse) cout << i << ' '; // prints 4 3 2 1 0 — end example]

25.7.21.2 Class template reverse_view [range.reverse.view]

🔗

namespace std::ranges {template<view V>requires bidirectional_rangeclass reverse_view : public view_interface<reverse_view> {private: V base_ = V(); // exposition onlypublic: reverse_view() requires default_initializable = default; constexpr explicit reverse_view(V r); constexpr V base() const & requires copy_constructible { return base_; }constexpr V base() && { return std::move(base_); }constexpr reverse_iterator<iterator_t> begin(); constexpr reverse_iterator<iterator_t> begin() requires common_range; constexpr auto begin() const requires common_range; constexpr reverse_iterator<iterator_t> end(); constexpr auto end() const requires common_range; constexpr auto size() requires sized_range {return ranges::size(base_); }constexpr auto size() const requires sized_range {return ranges::size(base_); }constexpr auto reserve_hint() requires approximately_sized_range {return ranges::reserve_hint(base_); }constexpr auto reserve_hint() const requires approximately_sized_range {return ranges::reserve_hint(base_); }}; template reverse_view(R&&) -> reverse_view<views::all_t>;}

🔗

constexpr explicit reverse_view(V base);

1

#

Effects: Initializes base_ with std::move(base).

🔗

constexpr reverse_iterator<iterator_t<V>> begin();

2

#

Returns: make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_)))

3

#

Remarks: In order to provide the amortized constant time complexity required by the range concept, this function caches the result within thereverse_view for use on subsequent calls.

🔗

constexpr reverse_iterator<iterator_t<V>> begin() requires [common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<V>; constexpr auto begin() const requires [common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<const V>;

4

#

Effects: Equivalent to: return make_reverse_iterator(ranges::end(base_));

🔗

constexpr reverse_iterator<iterator_t<V>> end(); constexpr auto end() const requires [common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<const V>;

5

#

Effects: Equivalent to: return make_reverse_iterator(ranges::begin(base_));