2011-08-04 88 views
27

設的特定位置,我有一個如何獲得迭代器的矢量

std::vector<int> v 
//and ... 
for(int i =0;i<100;++i) 
v.push_back(i); 

現在我想一個迭代,我們說的向量的10元。

而不做以下辦法

std::vector<int>::iterator vi; 
vi = v.begin(); 
for(int i = 0;i<10;i++) 
    ++vi; 

,因爲這會破壞具有用於矢量隨機訪問迭代的優點。

+0

[C++ STL向量:從索引獲取迭代器?](http://stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-from-index) –

回答

35

只需在迭代器中添加10即可。他們的目的是「感覺」像指針。

+0

謝謝..這是有幫助的 –

+1

你不想加9嗎? 將0移動添加到第1個元素, 將1移動添加到第2個元素, ... 將n-1移動添加到第n個元素。 – Shillard

+0

這是光滑的。 :-) –

46

這將任何隨機訪問迭代器正常工作,比如一個來自vectordeque

std::vector<int>::iterator iter = v.begin() + 10; 

如果你想一個解決方案,適用於任何類型的迭代器不起作用,使用next

std::vector<int>::iterator iter = std::next(v.begin(), 10); 

或者,如果你使用的不是C++ 11的實現,advance

std::vector<int>::iterator iter = v.begin(); 
std::advance(iter, 10); 
+0

謝謝...現在只需要爲我添加10件作品。但我會記下這個進展。 –

+1

我寧願std :: advance(),因爲它適用於任何迭代器;這樣你就不會被綁定到特定的容器。 –

+0

@Matt:很可能,如果你的算法需要第n個元素的訪問,那麼無論如何,除了隨機訪問迭代器以外的任何東西都是無用的低效率;所以使用'operator +'而不是'std :: advance'實際上會更好,並且會得到錯誤的迭代器類型的編譯器錯誤。 – ildjarn