2014-01-06 137 views
0

我找不到解決我的問題的方法。讓我們假設我們有N個這樣的地圖的元素:C++:映射的迭代

std::map<string, string> tmpMap; 

我們也得到了迭代這個地圖:

std::map<string, string>::iterator itTmpMap = tmpMap.begin(); 

我怎樣才能改變現在迭代例如第四對? Compilator不會讓我只爲迭代器添加一個整數。

Compilator error: 
int a = 4; 
itTmpMap = itTmpMap + a; 
+2

['的std ::提前()'](http://en.cppreference.com/ w/cpp/iterator/advance) – Angew

+0

你找不到解決方案?有太多的重複:( –

回答

5

使用函數std::advance()。它需要一個參考,而不是返回一個新的迭代,這是我永遠無法理解的古怪......

+0

C++ 11有'std :: next'和'std :: prev',如果你更喜歡處理返回值 –

+0

我更喜歡的模型,但不知道op是否有這可用.. – Nim

+0

這不是一個真正的「怪異」,它避免了一個副本,而適合於常見的用例,C++不會給你你不需要的東西,反正它不習慣:D –

0

你需要增加迭代器的4倍:

++itTmpMap; 
++itTmpMap; 
++itTmpMap; 
++itTmpMap; 
2

使用std::advance(itTmpMap, 4);地圖迭代器是一個雙向迭代器,而不是隨機訪問迭代器。

0

std::map的迭代器是雙向的。有幾個對這樣的迭代器有效的操作,但添加一個整數來移動它不是其中的一個。有幾個方法可以做到這一點:

// this will advance the iterator 4 times 
for (unsigned int i = 0; i < 4; ++i) 
    itTmpMap++; 

或者,首選方法

std::advance(itTmpMap, 4); 
1

std::map具有雙向迭代器。對於雙向迭代器,未定義操作迭代器+整型。所以要得到itTmpMap + 4的等價迭代器,你需要增加4次。 C++標準定義了這種操作的特殊功能。您可以使用返回類型爲void的std::advance。例如

std::advance(itTmpMap, 4); 

或者您可以使用std::next,爲源遞增的迭代器返回的參考。例如

std::next(itTmpMap, 4); 

例如遍歷開始與第四迭代地圖可以編寫

std::for_each(std::next(tmpMap.begin(), 4), tmpMap.end(), SomeFunction);