如何在C++的unordered_map中设置值并返回对应元素的引用?
问题原因分析
你用emplace无法得到正确结果的核心原因是语义不匹配:emplace仅当目标key不存在时才会插入新元素,若key已存在会直接跳过插入逻辑,不会覆盖已有值,和你原写法中[]赋值「无论key是否存在都覆盖为新值」的逻辑不一致。
最优实现方案
C++17 及以上版本
直接使用unordered_map提供的insert_or_assign方法,该方法语义和[]赋值完全一致,且全程仅执行一次哈希查找,无额外开销:
return &Nodes.insert_or_assign(pos, node).first->second;
insert_or_assign的返回值为std::pair<迭代器, 布尔值>,其中第一个元素就是指向对应key的元素迭代器,直接取second的地址即可得到正确的引用指针。
C++11/14 兼容版本
如果需要兼容旧标准,可以手动判断插入结果,不存在就插入,存在就覆盖,同样仅做一次查找:
auto emplace_res = Nodes.emplace(pos, node); if (!emplace_res.second) { emplace_res.first->second = node; } return &emplace_res.first->second;
原写法开销说明
你最初的写法会触发两次哈希查找:第一次是Nodes[pos] = node执行时的查找,第二次是返回时再次调用Nodes[pos]的查找,高频调用场景下的额外开销不可忽略,优化后写法可以完全消除这部分多余开销。
内容的提问来源于stack exchange,提问作者trshmanx
相关产品推荐
相关产品推荐

