std::reverse_iterator
| 定义于头文件 <iterator>
|
||
| template< class Iter > class reverse_iterator : public std::iterator< |
(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
|
| ||||
value_type
|
| ||||
difference_type
|
| ||||
pointer
|
std::iterator_traits<Iter>::pointer | ||||
reference
|
|
|
要求通过从 std::iterator<std::iterator_traits<Iter>::iterator_category |
(C++17 前) |
成员函数
| 构造新的迭代器适配器 (公开成员函数) | |
| 赋值另一迭代器适配器 (公开成员函数) | |
| 访问底层迭代器 (公开成员函数) | |
| 访问被指向的元素 (公开成员函数) | |
| 按索引访问元素 (公开成员函数) | |
| 推进或回退迭代器 (公开成员函数) |
成员对象
| 成员名称 | 定义 |
current (受保护成员对象)
|
base() 返回其副本的底层迭代器
|
非成员函数
| (C++14) |
创建拥有从实参推出的类型的 std::reverse_iterator (函数模板) |
| 比较底层迭代器 (函数模板) | |
| 令迭代器前进 (函数模板) | |
| 计算两个迭代器适配器间的距离 (函数模板) | |
| (C++20) |
转型解引用调整后的底层迭代器的结果为其所关联的右值引用类型 (函数) |
| (C++20) |
交换二个调整后的底层迭代器所指向的对象 (函数模板) |
辅助模板
| template< class Iterator1, class Iterator2 > requires (!std::sized_sentinal_for<Iterator1, Iterator2>) |
(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
参阅
| (C++17 中弃用) |
用于简化简单的迭代器的必要类型定义的基类 (类模板) |