前言
</br>
我们可以通过reverse_iterator的base函数将其转为iterator,只是其结果可能和我们预想的存在出入。
问题实例
</br>
考虑如下程序:1
2
3
4
5
6vector<int> v(5);
for(int i = 0;i < 5; ++ i) {
v.push_back(i);
}
vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);//ri指向3
vector<int>::iterator i(ri.base());
转换关系图
这张图清楚地展示了偏移量,但对我们解决实际问题毫无帮助。众所周知,insert与erase只接受iterator形式的参数,我们该如何通过base()来正确地完成这二者的操作呢?
base与insert、erase
insert
我们假定需要在ri指出的位置插入一个99。
因为ri遍历的顺序是自右向左,而且insert会把新元素插入到ri位置,并且把原先ri位置的元素依次移动到符合遍历顺序的下一个位置,综上,插入后应该是这样:
显然,99正对应着base的位置,事实上有结论如下:
如果要在一个reverse指出的位置上插入新元素,直接使用base即可,对于insert而言,ri.base()就是ri对应的iterator.
erase
如果要删除3肯定不能使用base了,因为base指向4.
但也不是没有解决办法,ri的base指向4,(++ri).base()不就指向3了吗,所以说核心在于先自增:1
v.erase((++ri).base());