我有这样的代码:
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() 在这里做什么?
base()
将反向迭代器转换为相应的正向迭代器。然而,尽管它很简单,但这种对应并不像一件可能的事情那么简单。
当反向迭代器指向一个元素时,它会取消对前一个元素的引用,因此它物理指向的元素和它逻辑指向的元素是不同的。在下图中,i
是一个正向迭代器,并且ri
是一个反向迭代器,由 构造i
:
i, *i
|
- 0 1 2 3 4 -
| |
*ri ri
因此,如果ri
逻辑上指向 element 2
,则它在物理上指向 element 3
。因此,当转换为前向迭代器时,生成的迭代器将指向 element 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
}
这是一个活生生的例子。
base()
返回底层基础迭代器。
reverse_iterator
基迭代器指的是当前指向的元素旁边的元素。那就是std::reverse_iterator(it).base() == std::next(it)
。
reverse_iterator
您可以在此处了解更多信息。