std::ranges::views::reverse, std::ranges::reverse_view
From cppreference.com
| Defined in header <ranges>
|
||
template< ranges::view V >
requires ranges::bidirectional_range<V>
class reverse_view
: public ranges::view_interface<reverse_view<V>>
|
(1) | (since C++20) |
namespace views {
inline constexpr /* unspecified */ reverse = /* unspecified */;
}
|
(2) | (since C++20) |
| Call signature |
||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto reverse( R&& r );
|
(since C++20) | |
1) A range adaptor that represents a view of underlying
view with reversed order.2) RangeAdaptorObject. The expression
views::reverse(e) is expression-equivalent to one of the following expressions, except that e is evaluated only once:
e.base(), if the type ofeis a (possibly cv-qualified) specialization ofreverse_view;- otherwise, if the type of
eis (possibly cv-qualified)ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K>for some iterator typeIand valueKof typeranges::subrange_kind:
ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), ifKisranges::subrange_kind::sized;- otherwise
ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
- otherwise
ranges::reverse_view{e}.
views::reverse unwraps reversed views if possible.A reverse_view always models bidirectional_range and common_range, and it models borrowed_range, sized_range, or random_access_range if the underlying view type V models the corresponding concept.
Data members
| Member | Description |
V base_ (private)
|
the underlying view (exposition-only member object*) |
non-propagating-cache<ranges::iterator_t<V>> cached_end_ (private) (present only if V does not satisfy common_range)
|
an object that caches the result of calls to begin()(exposition-only member object*) |
Member functions
constructs a reverse_view (public member function) | |
returns the underlying view V (public member function) | |
returns the beginning iterator of the reverse_view (public member function) | |
returns the end iterator of the reverse_view (public member function) | |
| returns the size of the view if it is bounded (public member function) | |
(C++26) |
returns the approximate size of the underlying approximately_sized_range (public member function) |
Inherited from ranges::view_interface | |
returns whether the derived view is empty, provided only if it satisfies sized_range or forward_range (public member function of std::ranges::view_interface<D>)
| |
(C++23) |
returns a constant iterator to the beginning of the range (public member function of std::ranges::view_interface<D>)
|
(C++23) |
returns a sentinel for the constant iterator of the range (public member function of std::ranges::view_interface<D>)
|
| returns whether the derived view is not empty, provided only if ranges::empty is applicable to it (public member function of std::ranges::view_interface<D>)
| |
returns the first element in the derived view, provided if it satisfies forward_range (public member function of std::ranges::view_interface<D>)
| |
returns the last element in the derived view, provided only if it satisfies bidirectional_range and common_range (public member function of std::ranges::view_interface<D>)
| |
returns the nth element in the derived view, provided only if it satisfies random_access_range (public member function of std::ranges::view_interface<D>)
| |
std::ranges::reverse_view::reverse_view
reverse_view() requires std::default_initializable<V> = default;
|
(1) | (since C++20) |
constexpr reverse_view( V r );
|
(2) | (since C++20) |
Parameters
| r | - | range to reverse |
std::ranges::reverse_view::base
constexpr V base() const& requires std::copy_constructible<V>;
|
(1) | (since C++20) |
constexpr V base() &&;
|
(2) | (since C++20) |
Returns the underlying view.
1) Copy-constructs the result from the underlying view. Equivalent to
return base_ ;.2) Move-constructs the result from the underlying view. Equivalent to
return std::move(base_ );.
std::ranges::reverse_view::begin
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin();
|
(1) | (since C++20) |
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin()
requires ranges::common_range<V>;
|
(2) | (since C++20) |
constexpr auto begin() const requires ranges::common_range<const V>;
|
(3) | (since C++20) |
1) Returns
std::make_reverse_iterator(ranges::next(ranges::begin(base_ ), ranges::end(base_ ))).
In order to provide the amortized constant time complexity required by the
range concept, this function caches the result within the cache object for use on subsequent calls.2,3) Equivalent to
return std::make_reverse_iterator(ranges::end(base_ ));.
std::ranges::reverse_view::end
constexpr std::reverse_iterator<ranges::iterator_t<V>> end();
|
(1) | (since C++20) |
constexpr auto end() const requires ranges::common_range<const V>;
|
(2) | (since C++20) |
Equivalent to return std::make_reverse_iterator(ranges::begin(base_ ));.
std::ranges::reverse_view::size
constexpr auto size() requires ranges::sized_range<V>;
|
(1) | (since C++20) |
constexpr auto size() const requires ranges::sized_range<const V>;
|
(2) | (since C++20) |
Returns the size of the view if the view is bounded. Equivalent to return ranges::size(base_ );.
std::ranges::as_rvalue_view::reserve_hint
constexpr auto reserve_hint()
requires ranges::approximately_sized_range<V>;
|
(1) | (since C++26) |
constexpr auto reserve_hint() const
requires ranges::approximately_sized_range<const V>;
|
(2) | (since C++26) |
Returns ranges::reserve_hint(base_ ).
Deduction guides
template< class R >
reverse_view( R&& ) -> reverse_view<views::all_t<R>>;
|
(since C++20) | |
Helper templates
template< class T >
constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> =
ranges::enable_borrowed_range<T>;
|
(since C++20) | |
This specialization of std::ranges::enable_borrowed_range makes reverse_view satisfy borrowed_range when the underlying view satisfies it.
Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint |
202502L |
(C++26) | ranges::approximately_sized_range and reserve_hint
|
Example
Run this code
#include <iostream>
#include <ranges>
int main()
{
static constexpr auto il = {3, 1, 4, 1, 5, 9};
std::ranges::reverse_view rv{il};
for (int i : rv)
std::cout << i << ' ';
std::cout << '\n';
for (int i : il | std::views::reverse)
std::cout << i << ' ';
std::cout << '\n';
// operator[] is inherited from std::view_interface
for (auto i{0U}; i != rv.size(); ++i)
std::cout << rv[i] << ' ';
std::cout << '\n';
}
Output:
9 5 1 4 1 3
9 5 1 4 1 3
9 5 1 4 1 3
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3494 | C++20 | reverse_view was never a borrowed_range
|
it is a borrowed_range if its underlying view is
|
See also
| iterator adaptor for reverse-order traversal (class template) | |
(C++20) |
reverses the order of elements in a range (algorithm function object) |
(C++20) |
creates a copy of a range that is reversed (algorithm function object) |