逆向迭代器
逆向迭代器(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();