正确使用reverse_iterator
对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的元素. 遍历的管用语句如下
vector<int> intVec = {1,2,3,4,5,56};
for (vector<int>::iterator it = intVec.begin(); it!=intVec.end();++it)
{
......
}
这里初学者往往会有两个误区.
误区1
一个是尝试用ierator逆序访问容器内部元素. 下面的运行代码存在很多问题.运行会直接崩溃. 问题1, 是尝试通过v.end得到容器的结束位置,然后通过迭代器-1的方式获取容器的最后一个元素. 这个方法对于vector ok, 但是有的个别容器一旦迭代器指到end是无法通过减法回退的. 逆向的起点即使通过这个方法找到,紧接这就会遇到问题2.
问题2: 迭代器类似指针,是不能比较大小确定元素的位置的. 通过迭代器的遍历,只能用等号选定起点, 用等号或不等号确定终点.
vector<int> intVec = {1,2,3,4,5,56};
vector<int>::iterator it = v.end();
vector<int>::reverse_iterator rit;
it = v.end();
it = --it;
for(;it>=v.begin();--it)
cout << *it << endl;
所以真的要通过iterator逆向遍历容器会是很麻烦的事情,可以实现的代码如下
vector<int>::iterator it = v.end();
it = v.end();
it = --it;
for(;it!=v.begin();--it)
cout << *it << endl;
cout << *(v.begin()) <<endl;
所以真要逆序访问容器用reverse_iterator才是正确的
vector v;
vector<int>::reverse_iterator rit;
for (rit = v.rbegin(); rit != v.rend(); ++rit)
cout << *rit << endl;
误区2,在for语句中使用迭代器it++ 与 ++it 认为是一样的效果
从功能上来说是一样的.但性能上++it高出了很多.原因是++it这个运算返回的是引用. 而it++返回的临时对象. 虽然结果一样但it++会导致循环中大量的临时对象构建和析构.
reverse_iterator在使用中不可或缺, 和iterator的转换关系要慎重
reverse_iterator 通过base() 转换出来的iterator在位置上有一个偏移. 使用时要注意.
网友评论