基本区别

调用reverse_iterator的base()成员函数可以得到“与之相对应的”iterator,但是这句话实际上并没有说明真正的含义。作为一个例子,先来看一下下面这段代码,它把数值1到5放进一个vector中,然后将一个reverse_iterator指向数值3,并且通过其base()函数初始化一个iterator:

1
2
3
4
5
6
7
8
	vector<int> v;
	v.reserve(5);
    for(int i=1;i<=5;i++)
    {
        v.push_back(i);
    }
    vector<int>::reverse_iterator ri=find(v.rbegin(),v.rend(),3);
    vector<int>::iterator i(ri.base());

在执行了上述代码之后,该vector和相应迭代器的状态如下图所示:

如图所示,在reverse_iterator与对应的由base()产生的iterator之间存在偏移,这段偏移也正好勾画出了rbegin()和begin()之间的偏移.

容器类的有些成员函数仅接受iterator作为迭代器参数.如果你希望在ri指定的位置上插入一个新的元素,那么就不能直接这样做,因为insert函数不接受reverse_iterator作为参数.如果你要删除ri所指的元素,则也存在相同的问题.

插入元素

在插入操作之前,ri指向元素3,而通过base()得到的i指向元素4.考虑到insert与遍历方向的关系,直接使用i进行insert操作,其结果与用ri来指定插入位置得到的结果完全相同.

如果要在一个reverse_iterator ri指定的位置上插入新元素,则只需在ri.base()位置处插入元素即可.对于插入操作而言,ri和ri.base()是等价的,ri.base()是真正与ri对应的iterator.

删除元素

如果要在一个reverse_iterator ri指定的位置上删除一个元素,则需要在ri.base()前面的位置上执行删除操作.对于删除操作而言,ri和ri.base()是不等价的,ri.base()不是与ri对应的iterator.

一种修改方法如下:

v.erase(--ri.base());

表达式–ri.base()确实指出了我们希望删除的元素.但是C和C++都规定了从函数返回的指针不应该被修改.既然不能对base()的结果做递减操作,那么只要先递增reverse_iterator,然后再调用base()函数即可!

v.erase((++ri).base());