std::ranges::views::reverse, std::ranges::reverse_view

< cpp‎ | ranges
template< ranges::view V >

    requires ranges::bidirectional_range<V>

class reverse_view : public ranges::view_interface<reverse_view<V>>
(1) (C++20 起)
namespace views {

    inline constexpr /*unspecified*/ reverse = /*unspecified*/;

}
(2) (C++20 起)
1) 代表带逆序的底层 view 的视图。
2) 表达式 views::reverse(E) 表达式等价于下列表达式之一,除了只求值 E 一次:
  • E.base() ,若 E 的类型是(可有 cv 限定的) reverse_view 的特化;
  • 否则,若 E 的类型是(可有 cv 限定的)某迭代器类型 Iranges::subrange_kind 类型值 Kranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K>
  • ranges::subrange<I, I, K>(E.end().base(), E.begin().base(), E.size()) ,若 Kranges::subrange_kind::sized;
  • 否则为 ranges::subrange<I, I, K>(E.end().base(), E.begin().base())
  • 否则为 ranges::reverse_­view{E}
换言之, views::reverse 尽可能解包逆转的视图。

表达式等价

表达式 e 表达式等价于表达式 f ,若 ef 拥有相同效果,均为潜在抛出或均非潜在抛出(即 noexcept(e) == noexcept(f) ),且均为常量子表达式或均非常量子表达式。

数据成员

std::ranges::reverse_view::base_

V base_ = V(); /* exposition-only */

底层视图。

成员函数

std::ranges::reverse_view::reverse_view

reverse_view() = default;
(1)
constexpr reverse_view(V base);
(2)
template<ranges::viewable_range R>

    requires
        ranges::bidirectional_range<R> &&
        std::constructible_from<V, views::all_t<R>>

constexpr reverse_view(R&& r);
(3)
1) 值初始化 base_
2)std::move(base) 初始化 base_
3)views::all(std::forward<R>(r)) 初始化 base_

参数

r - 要逆转的范围

std::ranges::reverse_view::base

constexpr V base() const;

等价于 return 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()
  requires ranges::common_range<V>;
(2)
constexpr std::reverse_iterator<ranges::iterator_t<const V>> begin() const
  requires ranges::common_range<const V>;
(2)
1) 返回 std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))) 。为了提供 range 概念所要求的均摊常数时间复杂度,此函数在 reverse_view 对象内缓存结果,用于后继调用。
2) 等价于 return std::make_­reverse_­iterator(ranges::end(base_­));

std::ranges::reverse_view::end

constexpr std::reverse_iterator<ranges::iterator_t<V>> end()
  requires ranges::common_range<V>;
constexpr std::reverse_iterator<ranges::iterator_t<const V>> end() const
  requires ranges::common_range<const V>;

等价于 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_);

}
constexpr auto size() const requires ranges::sized_range<const V> {

    return ranges::size(base_);

}

若视图有界则返回视图的大小。

推导指引

template<class R>
reverse_view(R&&) -> reverse_view<views::all_t<R>>;

示例

#include <array>
#include <ranges>
#include <iostream>
 
int main()
{
    std::array<int, 6> il {3, 1, 4, 1, 5, 9};
    std::ranges::reverse_view rv {il};
    for (int i : rv)
        std::cout << i << ' ';
}

输出:

9 5 1 4 1 3

参阅

逆序遍历的迭代器适配器
(类模板)