2013-10-10 57 views
1

我有一個循環模式與使用std :: map。std :: map - 元素訪問無例外,沒有插入

我只想在鍵值存在時檢索值,否則我不想插入元素。目前我正在使用count(key)find(key)(哪一個更好?從文檔複雜性看起來是相同的),如果它們返回我訪問地圖的正值。不過,我想避免在地圖上使用兩個操作。類似:

map<string, int> myMap; 
int returnvalue; 
boole result = myMap.get("key1",returnValue) 
if(result){ 
    \\ use returnValue 
} 

cplusplus.com讀取的std ::地圖文檔我發現了兩個功能,用於訪問地圖元素:

  • at():其中引發錯誤時拋出如果該鍵不存在
  • [] :如果密鑰不存在,則插入新值

沒有一個滿足我的必要性。

+0

你爲什麼要避免'的std ::地圖:: find'? – billz

+0

@billz沒理由,我忘記了查找返回一個迭代器。 – Maverik

回答

9

使用map::find

auto it = myMap.find(key); 

if (it != myMap.end()) 
{ 
    // use it->second 
} 
else 
{ 
    // not found 
} 

這部分很容易。更難的問題是當你想查找一個元素是否存在並返回時,如果是,則另外插入一個新的元素,所有這些都不需要搜索地圖兩次。爲此,您需要使用lower_bound,然後插入暗示。使用count()肯定

0

關鍵是存在 然後使用find()獲得第k/V對

if (myMap.count(key)) 
{ 
    auto it = myMap.find(key) 
} 
else 
{ 
// not found 
} 
+2

這是個不好的建議。使用find來確定元素是否存在,如果存在,使用它返回的迭代器訪問元素。查找兩次沒有意義(我還沒有找到'std :: map <> :: count'的合理用法)。 –

+1

這不是非常有效。改用Kerrek的答案。 – cdoubleplusgood

+0

如果你想將這個想法擴展到multimaps,'count'也不是很好的做法,因爲當你想知道數字是否爲非零時,你可能會計算一個大數。 –