从const unordered_map读取对象

时间:2012-11-13 01:32:29

标签: c++

为什么我不允许从常量unordered_map中读取对象?

const unordered_map<int, int> z;
int val = z[5]; // compile error

clang下的错误如下:

error: no viable overloaded operator[] for type 'const
      unordered_map<int, int>'
                        int val = z[5];

考虑到使用const vector的等效代码可以正常工作,我有点困惑为什么会出现这种行为。

2 个答案:

答案 0 :(得分:24)

表达式z[5]调用地图的非const成员函数。

这是因为如果找不到密钥,地图的operator[]将插入一个新元素,所以很明显它必须是非const。

对于vector operator[]没有插入任何内容,元素必须已经存在(或者你得到未定义的行为,所以等效的代码将访问空向量的第6个元素,这不是很好!)。

要在不添加密钥的情况下查找密钥,请使用:

int val = 0;
auto it = z.find(5);
if (it != z.end())
  val = it->second;

答案 1 :(得分:7)

正如Jonathan所说,operator[]方法是非const的,因为它可能会在找不到项目时添加默认值。

另一方面,正如Benjamin在评论中强调的那样,at()方法也适用于const。

const unordered_map<int, int> z;
int val = z.at(5); // Success!

缺点是当查找的值不在地图中时,会引发std::out_of_range异常,因此必须对其进行管理。