reverse_iterator的用法
文章目录
基本区别
调用reverse_iterator的base()成员函数可以得到“与之相对应的”iterator,但是这句话实际上并没有说明真正的含义。作为一个例子,先来看一下下面这段代码,它把数值1到5放进一个vector中,然后将一个reverse_iterator指向数值3,并且通过其base()函数初始化一个iterator:
|
|
在执行了上述代码之后,该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());
文章作者 Forz
上次更新 2017-07-14