Namespaces
Variants

std:: reverse_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定义于头文件 <iterator>
template < class Iter >
class reverse_iterator ;

std::reverse_iterator 是一种迭代器适配器,用于反转给定迭代器的方向,该迭代器必须至少是 LegacyBidirectionalIterator 或满足 bidirectional_iterator (C++20 起) 的要求。换言之,当提供双向迭代器时, std::reverse_iterator 会生成一个新的迭代器,该迭代器从底层双向迭代器定义的序列末尾向开头移动。

对于由迭代器 i 构造的反向迭代器 r ,关系式 & * r == & * ( i - 1 ) 始终成立(只要 r 可解引用 的);因此,由尾后迭代器构造的反向迭代器将解引用为序列中的最后一个元素。

这是由 标准库容器 的成员函数 rbegin() rend() 返回的迭代器。

range-rbegin-rend.svg

目录

嵌套类型

类型 定义
iterator_type Iter
iterator_category std:: iterator_traits < Iter > :: iterator_category [1]
value_type std:: iterator_traits < Iter > :: value_type [1]
difference_type std:: iterator_traits < Iter > :: difference_type
pointer std:: iterator_traits < Iter > :: pointer
reference std:: iterator_traits < Iter > :: reference
(C++20 前)
类型 定义
iterator_type Iter
iterator_concept
iterator_category
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer std:: iterator_traits < Iter > :: pointer
reference std:: iter_reference_t < Iter >
(C++20 起)
  1. 1.0 1.1 该定义由基类 std::iterator 特化提供,直至 C++17 标准。

数据成员

成员 描述
Iter current 底层迭代器
(受保护成员对象)

成员函数

构造新的 reverse_iterator
(公开成员函数)
赋值另一个 reverse_iterator
(公开成员函数)
访问底层迭代器
(公开成员函数)
访问所指向的元素
(公开成员函数)
通过索引访问元素
(公开成员函数)
前进或后退 reverse_iterator
(公开成员函数)

非成员函数

比较底层迭代器
(函数模板)
前进迭代器
(函数模板)
计算两个迭代器适配器间的距离
(函数模板)
(C++20)
将调整后的底层迭代器解引用结果转换为其关联的右值引用类型
(函数)
(C++20)
交换两个已调整底层迭代器所指向的对象
(函数模板)
创建从参数推断类型的 std::reverse_iterator
(函数模板)

辅助模板

template < class Iterator1, class Iterator2 >

requires ( ! std:: sized_sentinel_for < Iterator1, Iterator2 > )
inline constexpr bool disable_sized_sentinel_for

< std :: reverse_iterator < Iterator1 > , std :: reverse_iterator < Iterator2 >> = true ;
(自 C++20 起)

std::disable_sized_sentinel_for 的部分特化会阻止 reverse_iterator 的特化满足 sized_sentinel_for 概念——当其底层迭代器不满足该概念时。

可能的实现

以下是部分实现,重点关注内部迭代器的存储方式,仅当通过 operator * 获取内容时才调用 std::prev

template<class It>
class reverse_iterator
{
protected:
    It current = It();
public:
    reverse_iterator() = default;
    constexpr explicit reverse_iterator(It itr) : current(itr) {}
    template<class U>
        requires (!std::is_same_v<U, It> && std::convertible_to<const U&, It>)
    constexpr explicit reverse_iterator(const U& other) : current(other.base()) {}
    constexpr decltype(auto) operator*() const
    {
        return *std::prev(current); // <== 返回前一个元素的内容
    }
    constexpr reverse_iterator& operator++() { --current; return *this; }
    constexpr reverse_iterator operator++(int) { auto tmp = *this; ++(*this); return tmp; }
    constexpr reverse_iterator& operator--() { ++current; return *this; }
    constexpr reverse_iterator operator--(int) { auto tmp = *this; --(*this); return tmp; }
    constexpr It base() const { return current; }
    // 其他成员函数、友元函数和成员类型定义在此处未显示
};

注释

std::reverse_iterator 无法用于解引用操作返回对 * this 成员引用的迭代器(即所谓的“隐匿迭代器”)。隐匿迭代器的一个实例是 MSVC STL 中的 std::filesystem::path::iterator

示例

#include <cstddef>
#include <iostream>
#include <iterator>
template<typename T, std::size_t SIZE>
class Stack
{
    T arr[SIZE];
    std::size_t pos = 0;
public:
    T pop()
    {
        return arr[--pos];
    }
    Stack& push(const T& t)
    {
        arr[pos++] = t;
        return *this;
    }
    // 我们希望栈的遍历遵循后进先出顺序
    // 因此使用 std::reverse_iterator 作为现有迭代器的适配器
    // (当前情况下是简单指针:[arr, arr + pos))
    auto begin() { return std::reverse_iterator(arr + pos); }
    auto end() { return std::reverse_iterator(arr); }
};
int main()
{
    Stack<int, 8> s;
    s.push(5).push(15).push(25).push(35);
    for (int val : s)
        std::cout << val << ' ';
    std::cout << '\n';
}

输出:

35 25 15 5

参见

创建从参数推断类型的 std::reverse_iterator
(函数模板)
(C++17 中弃用)
用于简化简单迭代器必需类型定义的基类
(类模板)