2013-05-17 120 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