2012-07-09 68 views
1

我有一個迭代器。假設我需要不是從一開始就從某個特定點開始遍歷集合。對於我來說,獲取存儲在集合中的值是非常困難的,因爲它們是指針。因此,如何修改我的代碼以便從不是開始的點遍歷我的集合。 ?遍歷從一個特定索引到特定索引的集合

下面是代碼:

for(iter=make.at(level).begin();iter!=make.at(level).end();iter++) 
{ 
Function(*iter); 
} 

使用此給出了一個錯誤:

for(iter=make.at(level).begin()+10;iter!=make.at(level).end();iter++) 
    { 
    Function(*iter); 
    } 

回答

1

有不同類型的迭代器:ForwardIteratorBidirectionalIteratorRandomAccessIterator

ForwardIterator允許您僅使用增量運算符向前移動。 BidirectionalIterator允許兩個方向。 RandomAccessIterator允許任何升級,包括operator+operator-

你在想的那個是RandomAccessIterator,就像在std::vector中找到的那個。但std::set使用的是BidirectionalIterator。這意味着你只能增加和減少。

因此,您需要將循環迭代器放在循環之外並向前推進十次。爲了簡單起見,std::advance這樣做,並且對於BidirectionalIterator以及ForwardIterator(線性時間,因爲一次只有一個增量)和RandomAccessIterator(由於operator +的恆定時間)具有不同的兼容性。

std::set<T>::iterator iter = make.at(level).begin(); //more C++03 way 
auto iter = std::begin (make.at(level)); //more C++11 way 
std::advance (iter, 10); //start iterator 10 elements past beginning 
for (...) 
+0

iter = make.at(level).begin(); advance(iter,10);對於(; iter!= make.at(level).end(); iter ++) { 函數(* iter); } 但是這不起作用。 – 2012-07-09 08:29:40

+0

@ user1506031,您能否生成一個複製問題並詢問問題的小樣本?但有一點需要注意的是,你應該習慣於使用'++ iter',而不是'iter ++'與迭代器(並且它確實不會影響其他的東西)。 – chris 2012-07-09 08:40:21

+0

只有現在才能以這種方式工作.. :)有問題與範圍檢查。 – 2012-07-09 08:44:44