std::reverse_iterator
定义在头文件 <iterator> 中 |
||
template< class Iter > class reverse_iterator; |
||
std::reverse_iterator
是一个迭代器适配器,它反转给定迭代器的方向,该迭代器必须至少是 LegacyBidirectionalIterator 或模型 bidirectional_iterator
(自 C++20 起)。换句话说,当提供双向迭代器时,std::reverse_iterator
会生成一个新的迭代器,该迭代器从由底层双向迭代器定义的序列的末尾移动到开头。
对于从迭代器 r 构造的反向迭代器 i,关系 &*r == &*(i - 1) 始终为 true(只要 r 是 可解引用的);因此,从末尾后一个迭代器构造的反向迭代器会解引用到序列中的最后一个元素。
这是标准库容器的 rbegin()
和 rend()
成员函数返回的迭代器。
内容 |
[编辑] 成员类型
|
(直到 C++20) | ||||||||||||||||
|
(自 C++20 起) |
成员类型 |
(直到 C++17) |
[编辑] 成员函数
构造一个新的迭代器适配器 (公有成员函数) | |
为另一个迭代器适配器赋值 (公有成员函数) | |
访问底层迭代器 (公有成员函数) | |
访问所指向的元素 (公有成员函数) | |
通过索引访问元素 (公有成员函数) | |
递进或递减迭代器 (公有成员函数) |
[编辑] 成员对象
成员名称 | 定义 |
current (受保护) |
底层迭代器,base() 返回其副本 |
[编辑] 非成员函数
比较底层迭代器 (函数模板) | |
递进迭代器 (函数模板) | |
计算两个迭代器适配器之间的距离 (函数模板) | |
(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); // <== returns the content of prev } 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; } // Other member functions, friend functions, and member typedefs are not shown here. }; |
[编辑] 注意
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; } // we wish that looping on Stack would be in LIFO order // thus we use std::reverse_iterator as an adaptor to existing iterators // (which are in this case the simple pointers: [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 中已弃用) |
基类,简化简单迭代器所需类型的定义 (类模板) |