代码如下:
std::vector<int> datas;
datas.reverse(5);
for (int idx = 0; idx < 5; ++idx) datas.push_back(idx);
std::vector<int>::reverse_iterator ri = std::find(datas.rbegin(), datas.rend(), 3);
std::vector<int>::iterator i = ri.base();
datas的内存格式为
成员函数begin()、end()
从头部指向尾部;
成员函数rbegin()、rend()
从尾部指向头部;
我们有一个reverse_iterator
为ri,其指向元素3。ri.base()指向元素4。
1 插入元素
假定插入的元素为x, 调用datas.insert(ri.base(), x);
,插入x后元素向右移动布局为:1 2 3 x 4 5
。与在ri插入x后元素元素向左移动的布局吻合。
因此,欲在ri插入元素,直接调用其调用base()
后的iterator即可。
2 删除元素
由于实际指向4, 因此不能直接使用ri.base()进行删除,需要左移1步ri.base(),使其指向元素3, 调用为:datas.erase(--ri.base())
。
但是,有些编译器可能编译不过,因为ri.base()返回的是一个常量,对常量进行前置++不合乎语法规则。
移植性更好的做法是,先使ri左移一步,base()取出的就直接指向元素3了,调用修改为:datas.erase((++ri).base())
;
因此,欲在ri删除元素,需要左移ri,使其指向实际需要删除的元素。