查找不存在的键时,unordered_map 会返回啥

Posted

技术标签:

【中文标题】查找不存在的键时,unordered_map 会返回啥【英文标题】:What does unordered_map returns when looking for a key that doesn't exist查找不存在的键时,unordered_map 会返回什么 【发布时间】:2020-06-21 07:06:33 【问题描述】:

我有一个unordered_map<char, mystruct> h

如果h 不包含密钥x,这会返回什么?

mystruct ms = h['x'];

【问题讨论】:

简单回答:试试看!第二简单:阅读the documentation。 I read but couldn't understand. 它只是说如果值不存在则添加,但我不明白它返回的内容。 【参考方案1】:

如果指定的键'x'不存在,std::unordered_map::operator[]会先插入一个值初始化的mystruct,然后返回对插入的mystruct的引用。之后,ms 从插入的mystruct 复制初始化。

返回对映射到与 key 等效的键的值的引用,如果这样的键不存在,则执行插入。

当使用默认分配器时,这会导致...映射值为value-initialized。

返回值 如果不存在具有键 key 的元素,则引用新元素的映射值。

【讨论】:

【参考方案2】:

无序映射将尝试使用键“x”默认初始化 mystruct 并分配给我的结构。

如果你想避免这种情况,使用 .at(key) 如果它不存在它会抛出一个 out_of_range 异常,你可以捕获它并处理它。

【讨论】:

【参考方案3】:

如果你直接使用 h['any key which is not present'] 那么它会给它一些随机值。 您可以做的是,当您不确定它是否存在时,只需在 if 中使用它。如果存在,它将返回 true,如果不存在则返回 false。 例如:if(h['a'])cout

【讨论】:

“它会给它一些随机值” - 这不是真的 - 它给出了一个值初始化的mystruct,正如 Songyuanyao 在他的回答中所说的那样。这就是为什么您的if (h['a']) cout << h['a]; 建议也是错误的:这将添加一个元素,然后查看是否有某种方法可以在布尔上下文中评估h['a'] - 例如mystruct::operator bool() const 成员函数,如果是这样,那么它将执行转换并决定是否打印值初始化对象/如果不是,它将不会编译。

以上是关于查找不存在的键时,unordered_map 会返回啥的主要内容,如果未能解决你的问题,请参考以下文章

当计算机在我的代码中要求时我没有输入数组中存在的键时,如何打印“数组中不存在键(元素)”

Python3基础 使用get() 设定在查询一个不存在的键时,返回指定的内容

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

当使用向量作为键时,C++ unordered_map 失败

为啥 Sass `map-get()` 不为不存在的键返回错误?

c++ unordered_map判断元素是不是在哈希表里的两种方式