# std::reverse_iterator

< cpp‎ | iterator

定义于头文件 `<iterator>` |  |
template< class Iter > class reverse_iterator : public std::iterator< typename std::iterator_traits<Iter>::iterator_category, typename std::iterator_traits<Iter>::value_type, typename std::iterator_traits<Iter>::difference_type, typename std::iterator_traits<Iter>::pointer, typename std::iterator_traits<Iter>::reference > |  | (C++17 前)
template< class Iter > class reverse_iterator; |  | (C++17 起)

`std::reverse_iterator` 是一个反转给定必须至少是老式双向迭代器 (LegacyBidirectionalIterator) 或实现 `bidirectional_iterator` (C++20 起)的迭代器方向的适配器。换言之，提供双向迭代器时， `std::reverse_iterator` 产生一个新的迭代器，它从底层的双向迭代器所定义的序列的末尾移动到开端。

对于从迭代器 `i` 构造的 `r` 逆向迭代器，关系 &*r == &*(i-1) 始终为 true （只要 `r` 可解引用）；从而构造自末尾后一位置的迭代器的逆向迭代器解引用到序列的最后元素。

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

### 成员类型

成员类型 | 定义
`iterator_type` | `Iter`
`iterator_concept`(C++20) | 若 `Iter` 实现 std::random_access_iterator ，则为 std::random_access_iterator_tag 。否则为 std::bidirectional_iterator_tag
`iterator_category` |
std::iterator_traits<Iter>::iterator_category | (C++20 前)
若 std::iterator_traits<Iter>::iterator_category 实现 std::derived_from<std::random_access_iterator_tag> ，则为 std::random_access_iterator_tag 。否则为不更改的 std::iterator_traits<Iter>::iterator_category | (C++20 起)
`value_type` |
std::iterator_traits<Iter>::value_type | (C++20 前)
std::iter_value_t<Iter> | (C++20 起)
`difference_type` |
std::iterator_traits<Iter>::difference_type | (C++20 前)
std::iter_difference_t<Iter> | (C++20 起)
`pointer` | std::iterator_traits<Iter>::pointer
`reference` |
std::iterator_traits<Iter>::reference | (C++20 前)
std::iter_reference_t<Iter> | (C++20 起)

要求通过从 std::iterator<std::iterator_traits<Iter>::iterator_category , std::iterator_traits<Iter>::value_type , std::iterator_traits<Iter>::difference_type , std::iterator_traits<Iter>::pointer , std::iterator_traits<Iter>::reference > 继承获得成员类型 `iterator_category` 、 `value_type` 、 `difference_type` 、 `pointer` 及 `reference` 。 | (C++17 前)

### 成员函数

(构造函数) | 构造新的迭代器适配器 (公开成员函数)
operator= | 赋值另一迭代器适配器 (公开成员函数)
base | 访问底层迭代器 (公开成员函数)
operator*operator-> | 访问被指向的元素 (公开成员函数)
operator[] | 按索引访问元素 (公开成员函数)
operator++operator++(int)operator+=operator+operator--operator--(int)operator-=operator- | 推进或回退迭代器 (公开成员函数)

### 成员对象

成员名称 | 定义
`current` (受保护成员对象) | `base()` 返回其副本的底层迭代器

### 非成员函数

make_reverse_iterator (C++14) | 创建拥有从实参推出的类型的 std::reverse_iterator (函数模板)
operator==operator!=operator<operator<=operator>operator>=operator<=> (C++20) | 比较底层迭代器 (函数模板)
operator+ | 令迭代器前进 (函数模板)
operator- | 计算两个迭代器适配器间的距离 (函数模板)
iter_move (C++20) | 转型解引用调整后的底层迭代器的结果为其所关联的右值引用类型 (函数)
iter_swap (C++20) | 交换二个调整后的底层迭代器所指向的对象 (函数模板)

### 辅助模板

template< class Iterator1, class Iterator2 > requires (!std::sized_sentinal_for<Iterator1, Iterator2>) inline constexpr bool disable_sized_sentinel_for< std::reverse_iterator<Iterator1>, std::reverse_iterator<Iterator2>> = true; |  | (C++20 起)

若 `reverse_iterator` 的特化的底层迭代器不满足 `sized_sentinel_for` ，则 `std::disable_sentinel_for` 的此偏特化阻止这些特化满足该概念。

### 注解

`std::reverse_iterator` 不可作用于解引用返回到 `*this` 成员的迭代器（是谓“贮藏迭代器”）。贮藏迭代器的一个例子是 `std::filesystem::path::iterator` 。

### 示例

    #include <iostream>
    #include <string>
    #include <iterator>

    int main()
    {
        std::string s = "Hello, world";
        std::reverse_iterator<std::string::iterator> r = s.rbegin();
        r[7] = 'O'; // 以 'O' 替换 'o'
        r += 7; // 迭代器现在指向 'O'
        std::string rev(r, s.rend());
        std::cout << rev << '\n';
    }

输出：

    OlleH

### 参阅

iterator (C++17 中弃用) | 用于简化简单的迭代器的必要类型定义的基类 (类模板)