2013-05-17 58 views
13

我有这样的代码:C++ STL什么呢基()做

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

此代码删除从矢量v的第一个元素第一检测2后(在载体保持:0 1 2 4)。 .base()在这里做什么?

+0

也许你应该阅读:http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL

回答

22

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

8

base()返回基础基础迭代器。

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

您可以通过以下方式了解关于reverse_iteratorhere的更多信息。

enter image description here