std::ranges...reverse_view(3)
π NAME π
okay so welcome to the C++ Standard Libary manual page for std::ranges...reverse_view(3), bestie. This is the page for:
std::ranges::views::reverse,std::ranges::reverse_view - std::ranges::views::reverse,std::ranges::reverse_view
Itβs giving βreverse range adaptor with main character energy.β π
πΈ Synopsis πΈ
Defined in header <ranges>
template< ranges::view V >
requires ranges::bidirectional_range<V>
class reverse_view
: public ranges::view_interface<reverse_view<V>>
Thatβs (1) and itβs (since C++20).
namespace views {
inline constexpr /* unspecified */ reverse = /* unspecified */;
}
Thatβs (2) and itβs (since C++20).
π Call signature π
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto reverse( R&& r );
(since C++20).
- A range adaptor that represents a view of underlying view with reversed order.
RangeAdaptorObject. The expressionviews::reverse(e)is expression-equivalent to one of the following expressions, except thateis 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}.
In other words, views::reverse unwraps reversed views if possible. iykyk β¨
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. concept vibe check: passed π«Ά
π§Έ Member functions π§Έ
constructor(C++20)β constructs areverse_view(public member function)base(C++20)β returns the underlying viewV(public member function)begin(C++20)β returns the beginning iterator of thereverse_view(public member function)end(C++20)β returns the end iterator of thereverse_view(public member function)size(C++20)β returns the size of the view if it is bounded (public member function)
𧬠Inherited from std::ranges::view_interface π§¬
empty(C++20)β returns whether the derived view is empty. Provided if it satisfiessized_rangeorforward_range. (public member function ofstd::ranges::view_interface<D>)cbegin(C++23)β returns a constant iterator to the beginning of the range. (public member function ofstd::ranges::view_interface<D>)cend(C++23)β returns a sentinel for the constant iterator of the range. (public member function ofstd::ranges::view_interface<D>)operator bool(C++20)β returns whether the derived view is not empty. Provided ifranges::emptyis applicable to it. (public member function ofstd::ranges::view_interface<D>)front(C++20)β returns the first element in the derived view. Provided if it satisfiesforward_range. (public member function ofstd::ranges::view_interface<D>)back(C++20)β returns the last element in the derived view. Provided if it satisfiesbidirectional_rangeandcommon_range. (public member function ofstd::ranges::view_interface<D>)operator[](C++20)β returns the n^th element in the derived view. Provided if it satisfiesrandom_access_range. (public member function ofstd::ranges::view_interface<D>)
π οΈ std::ranges::reverse_view::reverse_view π οΈ
reverse_view() requires std::default_initializable<V> = default; (1)
constexpr reverse_view( V r ); (2)
Both are (since C++20).
- Value-initializes
base_via its default member initializer (= V()). - Initializes
base_withstd::move(r).
πΈ Parameters πΈ
rβ range to reverse
π std::ranges::reverse_view::base π
constexpr V base() const& requires std::copy_constructible<V>; (1)
constexpr V base() &&; (2)
Both are (since C++20).
Returns the underlying view.
- Copy-constructs the result from the underlying view. Equivalent to
return base_;. - 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)
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin() (2)
requires ranges::common_range<V>;
constexpr auto begin() const requires ranges::common_range<const V>; (3)
All three are (since C++20).
- 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 toreturn std::make_reverse_iterator(ranges::end(base_));.
the cache object is doing unpaid labor so your iterator stays fast, periodt π
π std::ranges::reverse_view::end π
constexpr std::reverse_iterator<ranges::iterator_t<V>> end(); (1)
constexpr auto end() const requires ranges::common_range<const V>; (2)
Both are (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)
constexpr auto size() const requires ranges::sized_range<const V>; (2)
Both are (since C++20).
Returns the size of the view if the view is bounded.
1,2) Equivalent to return ranges::size(base_);.
π Deduction guides π
template< class R >
reverse_view( R&& ) -> reverse_view<views::all_t<R>>;
(since C++20).
π§ Helper templates π§
template< class T >
inline constexpr bool
enable_borrowed_range<std::ranges::reverse_view<T>> =
std::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. borrowed-range behavior: inherited, no cap π«Ά
π Example π
The example literally says // 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
LWG 3494β Applied toC++20β Behavior as published:reverse_viewwas never aborrowed_rangeβ Correct behavior: it is aborrowed_rangeif its underlying view is.
π See also π
reverse_iteratorβ iterator adaptor for reverse-order traversal (class template)ranges::reverse(C++20)β reverses the order of elements in a range (niebloid)ranges::reverse_copy(C++20)β creates a copy of a range that is reversed (niebloid)
made with so much love, receipts from http://cppreference.com, version 2024.06.10, and the page std::ranges...reverse_view(3) β mwah πβ¨π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms