学科分类
目录
C++基础

逆向迭代器

逆向迭代器(reverse_iterator)是一种迭代器适配器,它能够重新定义迭代器的递增运算和递减运算,使其行为正好相反,逆向迭代器的遍历顺序如图1所示。

图1 逆向迭代器

逆向迭代器可以构造一个前进方向与原迭代器相反的迭代器,对其进行加n操作,则会使其后退n个元素,而进行减n操作,则会使其前进n个元素,对需要反向访问序列的算法,这一转换器非常有用。

STL中的容器提供了begin()与end()函数返回一个随机访问迭代器来访问元素,除此之外,各容器还提供了rbegin()与rend()这样一对函数,用于返回一个逆向迭代器,读者在学习时要注意它们的逻辑顺序,rbegin()返回的是逆向遍历的第一个元素,即倒数第一个元素,rend()返回的是逆向遍历的末尾元素的后一个位置,即第一个元素的上一个位置,其实这个位置已经不在容器中了。

逆向迭代器与正常迭代器可以互相转换,将正常迭代器作为参数传给reverse_iterator()即可。为了让读者更好的理解逆向迭代器,接下来我们通过一个案例来演示其用法,具体如例1所示。

例1

 1    #include <iostream>
 2    #include <list>
 3    using namespace std;
 4    int main()
 5    {
 6        list<int> lt; //创建一个list列表容器
 7        for (int i = 0; i < 10; i++)
 1            lt.push_back(i + 1);  //向容器中插入元素
 2        list<int>::iterator it;  //定义一个list迭代器
 3        for (it = lt.begin(); it != lt.end(); it++)
 4            cout << *it << " ";
 5        cout << endl;
 6        list<int>::reverse_iterator itr(it); //将it转换为逆向迭代器
 7        for (itr = lt.rbegin(); itr != lt.rend(); itr++) //itr++是上行移动
 8            cout << *itr << " ";
 9        cout << endl;
 10        system("pause");
 11        return 0;
 12    }

运行结果如图1所示。

图1 例1运行结果

在例1中,创建了一个list列表容器,第7-8行代码调用push_back()向容器中插入元素,然后第9行代码创建一个list<int>迭代器,从头遍历容器,输出遍历结果,由图1可知,容器中元素是顺序输出。第13行代码将it转换为逆向迭代器,然后从头遍历容器,输出遍历结果,由图1可知,容器中的元素被倒序输出。

​ 逆向迭代器类模板提供了一个base()函数,可以将逆向迭代器转换为正常的迭代器,例如,要将例1中的itr转换为正常的迭代器,则代码如下:

itr.base();
点击此处
隐藏目录