我有這樣的代碼: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()在這裏做什麼?
我有這樣的代碼: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()在這裏做什麼?
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。
base()
返回基礎基礎迭代器。
基本迭代器引用
reverse_iterator
當前指向的元素 旁邊的元素。那是std::reverse_iterator(it).base() == std::next(it)
。
您可以通過以下方式瞭解關於reverse_iterator
here的更多信息。
也許你應該閱讀:http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL