std::reverse_iterator
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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 起) |
数据成员
| 成员 | 描述 |
Iter current
|
底层迭代器 (受保护成员对象) |
成员函数
构造新的 reverse_iterator (公开成员函数) | |
赋值另一 reverse_iterator (公开成员函数) | |
| 访问底层迭代器 (公开成员函数) | |
| 访问被指向的元素 (公开成员函数) | |
| 按索引访问元素 (公开成员函数) | |
推进或回退 reverse_iterator (公开成员函数) |
非成员函数
| 比较底层迭代器 (函数模板) | |
| 令迭代器前进 (函数模板) | |
| 计算两个迭代器适配器间的距离 (函数模板) | |
(C++20) |
将解引用调整后的底层迭代器的结果转换为其关联的右值引用类型 (函数) |
(C++20) |
交换两个调整后的底层迭代器所指向的对象 (函数模板) |
(C++14) |
创建拥有从实参推出的类型的 std::reverse_iterator (函数模板) |
辅助模板
<tbody> </tbody> template< class Iterator1, class Iterator2 > requires (!std::sized_sentinal_for<Iterator1, Iterator2>) inline constexpr bool disable_sized_sentinel_for <std::reverse_iterator<Iterator1>, std::reverse_iterator<Iterator2>> = true; |
(C++20 起) | |
如果 reverse_iterator 的特化的底层迭代器不满足 sized_sentinel_for,那么 std::disable_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); // <== 返回 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; }
// 这里未列出其他成员函数,友元函数,和成员 typedef。
};
|
注解
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;
}
// 我们希望以后进先出顺序在 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 << ' ';
std::cout << '\n';
}
输出:
35 25 15 5
参阅
(C++14) |
创建拥有从实参推出的类型的 std::reverse_iterator (函数模板) |
(C++17 弃用) |
简化简单的迭代器的必要类型定义的基类 (类模板) |