table of contents
        
      
      
    | std::ranges::views::reverse,std::ranges::reverse_view(3) | C++ Standard Libary | std::ranges::views::reverse,std::ranges::reverse_view(3) | 
NAME¶
std::ranges::views::reverse,std::ranges::reverse_view - std::ranges::views::reverse,std::ranges::reverse_view
Synopsis¶
 Defined in header <ranges>
  
   template< ranges::view V >
  
   requires ranges::bidirectional_range<V> (1) (since
  C++20)
  
   class reverse_view : public
  
   ranges::view_interface<reverse_view<V>>
  
   namespace views {
  
   inline constexpr /* unspecified */ reverse = /* unspecified */; (2)
    (since C++20)
  
   }
  
   Call signature
  
   template< ranges::viewable_range R >
  
   requires /* see below */ (since C++20)
  
   constexpr ranges::view auto reverse( R&& r );
  
   1) A range adaptor that represents a view of underlying view with reversed
    order.
  
   2) Range adaptor object. 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 of e is a (possibly cv-qualified) specialization of
  
   reverse_view;
  
   * otherwise, if the type of e is (possibly cv-qualified)
  
   ranges::subrange<std::reverse_iterator<I>,
    std::reverse_iterator<I>, K> for some
  
   iterator type I and value K of type ranges::subrange_kind:
  
   * ranges::subrange<I, I, K>(e.end().base(), e.begin().base(),
    e.size()),
  
   if K is ranges::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.
  
   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.
  
   Expression-equivalent
  
   Expression e is expression-equivalent to expression f, if
  
   * e and f have the same effects, and
  
   * either both are constant subexpressions or else neither is a constant
  
   subexpression, and
  
   * either both are potentially-throwing or else neither is
    potentially-throwing
  
   (i.e. noexcept(e) == noexcept(f)).
  
   Data members
  
   Typical implementations of reverse_view hold only one or two member
  objects:
  
   * the underlying view of type V (shown here as base_, the name is exposition
  
   only), and
  
   * a std::optional-like cache object that holds either no value or the end
  
   iterator/position of the underlying view, which exists only if the underlying
  
   view type V does not model common_range.
Member functions¶
 constructor constructs a reverse_view
  
   (C++20) (public member function)
  
   base returns the underlying view V
  
   (C++20) (public member function)
  
   begin returns the beginning iterator of the reverse_view
  
   (C++20) (public member function)
  
   end returns the end iterator of the reverse_view
  
   (C++20) (public member function)
  
   size returns the size of the view if it is bounded
  
   (C++20) (public member function)
  
   Inherited from std::ranges::view_interface
  
   empty Returns whether the derived view is empty. Provided if it satisfies
  
   (C++20) sized_range or forward_range.
  
   (public member function of std::ranges::view_interface<D>)
  
   operator bool Returns whether the derived view is not empty. Provided if
  
   (C++20) ranges::empty is applicable to it.
  
   (public member function of std::ranges::view_interface<D>)
  
   front Returns the first element in the derived view. Provided if it
  
   (C++20) satisfies forward_range.
  
   (public member function of std::ranges::view_interface<D>)
  
   back Returns the last element in the derived view. Provided if it satisfies
  
   (C++20) bidirectional_range and common_range.
  
   (public member function of std::ranges::view_interface<D>)
  
   operator[] Returns the nth element in the derived view. Provided if it
    satisfies
  
   (C++20) 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)
  
   1) Value-initializes base_ via its default member initializer (= V()).
  
   2) Initializes base_ with std::move(r).
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()
    (2) (since C++20)
  
   requires ranges::common_range<V>;
  
   constexpr auto begin() const requires ranges::common_range<const
    (3) (since C++20)
  
   V>;
  
   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> {
  
   return ranges::size(base_); (1) (since C++20)
  
   }
  
   constexpr auto size() const requires ranges::sized_range<const V>
  
   {
  
   (2) (since C++20)
  
   return ranges::size(base_);
  
   }
  
   Returns the size of the view if the view is bounded.
  
   Deduction guides
  
   template<class R> (since C++20)
  
   reverse_view(R&&) ->
  reverse_view<views::all_t<R>>;
  
   Helper templates
  
   template<class T>
  
   inline constexpr bool (since C++20)
  
   enable_borrowed_range<std::ranges::reverse_view<T>> =
  
   std::ranges::enable_borrowed_range<T>;
  
   This specialization of std::ranges::enable_borrowed_range makes reverse_view
    satisfy
  
   borrowed_range when the underlying view satisfies it.
Example¶
// Run this code
  
   #include <ranges>
  
   #include <iostream>
  
   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 `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 it is a borrowed_range if its
  
   borrowed_range underlying view is
See also¶
 reverse_iterator iterator adaptor for reverse-order traversal
  
   (class template)
  
   ranges::reverse reverses the order of elements in a range
  
   (C++20) (niebloid)
  
   ranges::reverse_copy creates a copy of a range that is reversed
  
   (C++20) (niebloid)
| 2022.07.31 | http://cppreference.com |