从常量读取对象 unordered_map

reading object from const unordered_map

本文关键字:map unordered 取对象 常量 读取      更新时间:2023-10-16

为什么不允许我从常量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的等效代码工作正常,我有点困惑为什么我们会得到这种行为。

表达式z[5]调用映射的非常量成员函数。

这是因为如果找不到键,映射的operator[]将插入一个新元素,因此显然它必须是非常量元素。

对于vector operator[]没有插入任何内容,该元素必须已经存在(否则您将获得未定义的行为,因此等效代码将访问空向量的第 6 个元素,这不行!

要查找密钥而不添加它,请使用:

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

正如 Jonathan 已经说过的,operator[] 方法是 non-const,因为当找不到正在查找的项目时,它可能会添加默认值。

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

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

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