28. 正确理解由reverse

mac2024-03-10  25

代码如下:

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,使其指向实际需要删除的元素。

最新回复(0)