2011-04-06 98 views
1

我找了一些代碼,看起來像這樣迭代器上的C++映射?

map<string, int>::iterator itr = mValue.find(inName); 

他們爲什麼要定義一個迭代器。是不是可以這樣說

int value = mValue.find(inName) 

謝謝。

+0

也許upvote一些答案 – 2011-04-06 19:03:07

回答

1
int value = mValue.find(inName)->second; 

提供發現沒有返回mValue.end()

5

如果該鍵不存在於地圖存在,會發生什麼?你會爲find返回什麼?使用迭代器,您可以返回mValue.end()。另外,迭代器允許迭代 - int不能。

2

mValue.find(inName)將迭代器返回到地圖中位置爲inName的位置。如果您只需要相應的值,則可以使用mValue[inName]

+1

這是非常量,但會創建一個映射條目,如果它不存在。 (並不是說原始代碼在沒有價值的情況下沒有那麼慘重)。 – 2011-04-06 19:03:49

14

您可以通過取消引用迭代器來獲取值(就像它是一個指針一樣)。這將返回一個密鑰/值對的類型,其具有的值是一個構件second

map<string, int>::iterator itr = mValue.find(inName); 
int value = itr->second; 

返回一個迭代器的原因是因爲當一個匹配找不到則返回end()迭代:

map<string, int>::iterator itr = mValue.find(inName); 
if (itr == mValue.end()) 
{ 
    throw "No value could be found."; 
} 

int value = itr->second; 

希望這是有道理的。

+0

+1對解引用迭代器的明確說明 – 2013-08-02 23:21:29

-2

原因:

因爲find會在映射中返回找到該鍵的位置。如果沒有找到,它會返回NULL,因此檢查

編輯:更新答案,但不刪除原始內容,讓其他人知道什麼是錯的,以及爲什麼這個答案是downvoted。

更新答:

因爲發現返回對在關鍵是找到地圖的位置。如果找不到,則返回map.end()。

+0

未找到時不會重新生成NULL。所以-1錯誤的答案。 – Sjoerd 2011-04-06 19:05:03

+0

借調在最初downvote後不刪除答案。 – phooji 2011-04-06 19:44:36

+0

@ phooji:每個人都不可能一直上網。如果您覺得自己想要退縮只是因爲該人沒有刪除答案,您可以自由選擇。 – mukeshkumar 2011-04-07 09:11:29

1

你可能想使用

map<string, int>::iterator itr = mValue.find(inName); 
int value = mValue[inName]; 

mValue[inName] = 1234; 

照顧,也不會一個const地圖上工作(因爲它將無法插入條目)

1

他們爲什麼定義一個迭代器。

,因爲這是在map .find()函數返回時,包含 鍵和值迭代器。或者,如果找不到該值,則返回mValue.end(),因爲您可以測試該值是否在地圖中找到,所以它很有用。

,讓你可以做的值:

map<string, int>::iterator itr = mValue.find(inName); 
if(itr != map.end()) { 
    int value = itr->second; 
    // use value 
} 

是沒可能說類似int值= mValue.find(inName)

不,的std ::地圖沒有這樣的功能。 (如果是這樣,它將不得不拋出一個例外,如果沒有找到該值)

+0

它確實有這樣一個函數('operator []'),但是如果它還不存在的話(它不得不拋出異常),它會在映射中插入鍵的附加副作用。 – dfan 2011-04-06 19:56:02