2013-02-13 128 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; 
}