c ++ stl base()做什么

Vit*_*i K 22 c++ vector erase

我有这样的代码:

vector <int> v;
for (int i=0; i<5; i++)
        v.push_back(i);
v.erase(find(v.rbegin(), v.rend(),2).base());
Run Code Online (Sandbox Code Playgroud)

该代码在第一次检测到2之后从向量v中删除第一个元素(在向量中保留:0 1 2 4)..base()在这做什么?

And*_*owl 31

base()将反向迭代器转换为相应的前向迭代器.然而,尽管它很简单,但这种对应并不像人们所做的那样微不足道.

当反向迭代器指向一个元素时,它会取消引用前一个元素,因此它物理指向的元素和它逻辑指向的元素是不同的.在下图中,i是一个正向迭代器,它ri是一个反向迭代器,由i以下构造:

                             i, *i
                             |
    -      0     1     2     3     4     -
                       |     | 
                       *ri   ri
Run Code Online (Sandbox Code Playgroud)

因此,如果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
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.


zak*_*ter 14

base() 返回底层的基础迭代器.

基本迭代器引用reverse_iterator当前指向的元素旁边的元素.那是 std::reverse_iterator(it).base() == std::next(it).

您可以reverse_iterator 在这里了解更多信息.

在此输入图像描述