2013-02-13 124 views
0

我想這段代碼unordered_map判斷鑰匙是否在地圖

#include <iostream> 
#include <utility> 
#include <vector> 
#include <unordered_map> 
#include <stdexcept> 

using namespace std; 

int main() { 
    unordered_map<int,int> parent_map; 
    try { 
     int a = parent_map[0]; 
     cout<<a<<endl; 

    } catch (out_of_range oe) { 
     cout<<"out of range"<<endl; 
    } 

    return 0; 

} 

我覺得超出範圍的異常應該被捕獲。然而,輸出是

0 

我很困惑。我記得之前我有這個工作。

+3

你想用'at'捕捉到異常。 – Pubby 2013-02-13 06:50:26

回答

1
int a = parent_map[0]; 

是分配新進入該地圖鍵0,並且默認值0

你基本上這樣做:

parent_map[0] = int(); 

你想要做什麼是find()在地圖的關鍵,並檢查它不是容器的

if(parent_map.find(0) != parent_map.end()) 
{ 
    // Element exists. 
} 
+0

不應該賦值爲parent_map [0] = a? – 2013-02-13 06:52:30

+1

@AlfredZhong:它將「parent_map [0]」評估爲表達式,其含義是返回對映射中索引爲0的元素的引用,如果它不存在則創建該引用。這種行爲對於允許方便的符號'parent_map [0] = a':左側 - parent_map [0]' - 在分配完成之前被評估爲表達式是必要的。它也可以很方便,如'while(file >> word)++ word_count [word];'它簡單地創建了輸入中所有不同單詞的計數,但有時候它會讓你感到困惑。優點和缺點。 – 2013-02-13 07:17:26

5

operator[]不扔,你想嘗試std::unordered_map::at

int a = parent_map.at(0); 

此外,如果關鍵是沒有找到operator[]插入一個元素。

並且要通過參考

catch (const out_of_range &oe) { 
    cout<<"out of range: " << oe.what() <<endl; 
}