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 ) 始终成立(只要 r 是 可解引用 的);因此,由尾后迭代器构造的反向迭代器将解引用为序列中的最后一个元素。
这是由
标准库容器
的成员函数
rbegin()
和
rend()
返回的迭代器。
目录 |
嵌套类型
|
(C++20 前) | ||||||||||||||||
|
(C++20 起) |
- ↑ 1.0 1.1 该定义由基类 std::iterator 特化提供,直至 C++17 标准。
数据成员
| 成员 | 描述 |
Iter
current
|
底层迭代器
(受保护成员对象) |
成员函数
构造新的
reverse_iterator
(公开成员函数) |
|
赋值另一个
reverse_iterator
(公开成员函数) |
|
|
访问底层迭代器
(公开成员函数) |
|
|
访问所指向的元素
(公开成员函数) |
|
|
通过索引访问元素
(公开成员函数) |
|
前进或后退
reverse_iterator
(公开成员函数) |
非成员函数
|
比较底层迭代器
(函数模板) |
|
|
前进迭代器
(函数模板) |
|
|
计算两个迭代器适配器间的距离
(函数模板) |
|
|
(C++20)
|
将调整后的底层迭代器解引用结果转换为其关联的右值引用类型
(函数) |
|
(C++20)
|
交换两个已调整底层迭代器所指向的对象
(函数模板) |
|
(C++14)
|
创建从参数推断类型的
std::reverse_iterator
(函数模板) |
辅助模板
|
template
<
class
Iterator1,
class
Iterator2
>
requires
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(自 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
参见
|
(C++14)
|
创建从参数推断类型的
std::reverse_iterator
(函数模板) |
|
(C++17 中弃用)
|
用于简化简单迭代器必需类型定义的基类
(类模板) |