std::reverse_iterator
在标头 <iterator> 定义
|
||
template< class Iter > class reverse_iterator; |
||
std::reverse_iterator
是一个反转了必须至少是老式双向迭代器 (LegacyBidirectionalIterator) 或实现 bidirectional_iterator
(C++20 起) 的给定迭代器方向的适配器。换言之,提供双向迭代器时,std::reverse_iterator
产生一个新的迭代器,它从底层的双向迭代器所定义的序列的末尾移动到开端。
对于从迭代器 i 构造的 r 逆向迭代器,关系 &*r == &*(i - 1) 始终是 true(只要 r 可解引用);从而构造自末尾后一位置的迭代器的逆向迭代器解引用到序列的最后元素。
这是标准库容器的成员函数 rbegin()
及 rend()
所返回的迭代器。
成员类型
|
(C++20 前) | ||||||||||||||||
|
(C++20 起) |
要求通过从 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 <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; } // 我们希望以后进先出(LIFO)顺序在 Stack 上做循环 // 因此我们对既有迭代器使用作为适配器的 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 << ' '; }
输出:
35 25 15 5
参阅
(C++14) |
创建拥有从实参推出的类型的 std::reverse_iterator (函数模板) |
(C++17 中弃用) |
用于简化简单的迭代器的必要类型定义的基类 (类模板) |