std::reverse_iterator
来自 cppreference.cn
定义于头文件 <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 起) |
- ↑ 1.0 1.1 该定义由 C++17 之前的基本 std::iterator 特化提供。
[编辑] 数据成员
成员 | 描述 |
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); // <== 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 中已弃用) |
简化简单迭代器所需类型定义的基类 (类模板) |