我有这样的代码:
vector <int> v;
for (int i=0; i<5; i++)
v.push_back(i);
v.erase(find(v.rbegin(), v.rend(),2).base());
此代码在第一次检测到2之后从向量v中删除第一个元素(向量中保留:0 1 2 4)。 .base()在这做什么?
答案 0 :(得分:28)
base()
将反向迭代器转换为相应的前向迭代器。然而,尽管它很简单,但这种对应并不像人们想象的那样微不足道。
当反向迭代器指向一个元素时,它会取消引用前一个元素,因此物理指向的元素和逻辑指向的元素不同。在下图中,i
是前向迭代器,ri
是从i
构造的反向迭代器:
i, *i
|
- 0 1 2 3 4 -
| |
*ri ri
因此,如果ri
逻辑上指向元素2
,则它实际上指向元素3
。因此,当转换为前向迭代器时,生成的迭代器将指向元素3
,这是在您的示例中被删除的元素。
以下小程序演示了上述行为:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(int argc, char *argv[])
{
std::vector<int> v { 0, 1, 2, 3, 4 };
auto i = find(begin(v), end(v), 2);
std::cout << *i << std::endl; // PRINTS 2
std::reverse_iterator<decltype(i)> ri(i);
std::cout << *ri << std::endl; // PRINTS 1
}
这是live example。
答案 1 :(得分:13)
base()
返回基础的基础迭代器。
基本迭代器是指元素旁边的元素
reverse_iterator
目前正指向。那是std::reverse_iterator(it).base() == std::next(it)
。
您可以详细了解reverse_iterator
here。