#include <iterator> using namespace std;
反向迭代器的模板类定义如下:注意,第二行代码不是必需的,但如果不用,则程序中只要创建该迭代器时,必须手动注明 std 命名空间(强烈建议初学者使用)。
template <class Iterator> class reverse_iterator;注意,Iterator 模板参数指的是模板类中所用的基础迭代器的类型,只能选择双向迭代器或者随机访问迭代器。
这意味着,如果想使用反向迭代器实现逆序遍历容器,则该容器的迭代器类型必须是双向迭代器或者随机访问迭代器。
std::reverse_iterator<std::vector<int>::iterator> my_reiter;由此,我们就创建好了一个没有指向任何对象的 my_reiter 反向迭代器。
//创建并初始化一个 myvector 容器 std::vector<int> myvector{1,2,3,4,5}; //创建并初始化 my_reiter 迭代器 std::reverse_iterator<std::vector<int>::iterator> my_reiter(myvector.end());我们知道,反向迭代器是通过操纵内部的基础迭代器实现逆向遍历的,但是反向迭代器的指向和底层基础迭代器的指向并不相同。以上面创建的 my_reiter 为例,其内部的基础迭代器指向的是 myvector 容器中元素 5 之后的位置,但是 my_reiter 指向的却是元素 5。
其中,begin 和 end 表示基础迭代器,r(begin) 和 r(end) 分别表示有 begin 和 end 获得的反向迭代器。
//创建并初始化一个 vector 容器 std::vector<int> myvector{1,2,3,4,5}; //调用复制构造函数初始化反向迭代器的 2 种方式 std::reverse_iterator<std::vector<int>::iterator> my_reiter(myvector.rbegin()); //std::reverse_iterator<std::vector<int>::iterator> my_reiter = myvector.rbegin();由此,my_reiter 反向迭代器指向的就是 myvector 容器中最后一个元素(也就是 5)之后的位置。
重载运算符 | 功能 |
---|---|
operator* | 以引用的形式返回当前迭代器指向的元素。 |
operator+ | 返回一个反向迭代器,其指向距离当前指向的元素之后 n 个位置的元素。此操作要求基础迭代器为随机访问迭代器。 |
operator++ | 重载前置 ++ 和后置 ++ 运算符。 |
operator+= | 当前反向迭代器前进 n 个位置,此操作要求基础迭代器为随机访问迭代器。 |
operator- | 返回一个反向迭代器,其指向距离当前指向的元素之前 n 个位置的元素。此操作要求基础迭代器为随机访问迭代器。 |
operator-- | 重载前置 -- 和后置 -- 运算符。 |
operator-= | 当前反向迭代器后退 n 个位置,此操作要求基础迭代器为随机访问迭代器。 |
operator-> | 返回一个指针,其指向当前迭代器指向的元素。 |
operator[n] | 访问和当前反向迭代器相距 n 个位置处的元素。 |
#include <iostream> #include <iterator> #include <vector> using namespace std; int main() { //创建并初始化一个 vector 容器 std::vector<int> myvector{ 1,2,3,4,5,6,7,8 }; //创建并初始化一个反向迭代器 std::reverse_iterator<std::vector<int>::iterator> my_reiter(myvector.rbegin());//指向 8 cout << *my_reiter << endl;// 8 cout << *(my_reiter + 3) << endl;// 5 cout << *(++my_reiter) << endl;// 7 cout << my_reiter[4] << endl;// 3 return 0; }程序执行结果为:
8
5
7
3
#include <iostream> #include <iterator> #include <vector> using namespace std; int main() { //创建并初始化一个 vector 容器 std::vector<int> myvector{ 1,2,3,4,5,6,7,8 }; //创建并初始化反向迭代器 begin,其指向元素 1 之前的位置 std::reverse_iterator<std::vector<int>::iterator> begin(myvector.begin()); //创建并初始化反向迭代器 begin,其指向元素 8 std::reverse_iterator<std::vector<int>::iterator> end(myvector.end()); //begin底层基础迭代器指向元素 1,end底层基础迭代器指向元素 8 之后的位置 for (auto iter = begin.base(); iter != end.base(); ++iter) { std::cout << *iter << ' '; } return 0; }程序执行结果为:
1 2 3 4 5 6 7 8
注意程序中第 13 行代码,begin 和 end 都是反向迭代器,通过调用 base() 成员方法,可以获取各自底层对应的基础迭代器。由于基础迭代器类型为随机访问迭代器,因此其 ++ 操作实现的就是普通意义上的正向遍历。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有