C++ STL 反向迭代器适配器(reverse_iterator)详解
我们知道,C++ 11 的 STL 标准库提供有 4 种迭代器适配器,本节开始将一一介绍它们的功能和用法,这里先讲解反向迭代器适配器。
反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。
值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。不仅如此,通过对 ++(递增)和 --(递减)运算符进行重载,使得:
- 当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器;
- 当反向迭代器执行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。
另外,实现反向迭代器的模板类定义在 <iterator> 头文件,并位于 std 命名空间中。因此,在使用反向迭代器时,需包含如下语句:
#include <iterator> using namespace std;
注意,第二行代码不是必需的,但如果不用,则程序中只要创建该迭代器时,必须手动注明 std 命名空间(强烈建议初学者使用)。
反向迭代器的模板类定义如下:
template <class Iterator> class reverse_iterator;
注意,Iterator 模板参数指的是模板类中所用的基础迭代器的类型,只能选择双向迭代器或者随机访问迭代器。
这意味着,如果想使用反向迭代器实现逆序遍历容器,则该容器的迭代器类型必须是双向迭代器或者随机访问迭代器。
C++ STL反向迭代器的创建
reverse_iterator 模板类中共提供了 3 种创建反向迭代器的方法,这里以 vector<int> 容器的随机访问迭代器作为基础迭代器为例。
1) 调用该类的默认构造方法,即可创建了一个不指向任何对象的反向迭代器,例如:
std::reverse_iterator<std::vector<int>::iterator> my_reiter;
由此,我们就创建好了一个没有指向任何对象的 my_reiter 反向迭代器。
2) 当然,在创建反向迭代器的时候,我们可以直接将一个基础迭代器作为参数传递给新建的反向迭代器。例如:
//创建并初始化一个 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。
也就是说,反向迭代器的指向和其底层基础迭代器的指向具有这样的关系,即反向迭代器的指向总是距离基础迭代器偏左 1 个位置;反之,基础迭代器的指向总是距离反向迭代器偏右 1 个位置处。它们的关系如图 1 所示。
发表评论