查找不存在的键时,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() 设定在查询一个不存在的键时,返回指定的内容
当使用向量作为键时,C++ unordered_map 失败