从常量读取对象 unordered_map
reading object from const unordered_map
为什么不允许我从常量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
异常,因此必须对其进行管理。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶