C++ std::unordered_map的find()与contains()性能对比及选择
关于std::unordered_map元素检查与访问的性能对比
问题说明
需要判断std::unordered_map中是否存在指定元素并直接使用该元素,对比以下两种方案的性能差异,同时方案2的可读性更优,但疑问它是否因两次哈希查找导致性能更差。
基础代码定义
std::unordered_map<int, std::string> my_map; int my_key;
方案1
if (const auto& iter = my_map.find(my_key); iter != my_map.end()) { const auto& value = iter->second; }
方案2
if (my_map.contains(my_key)) { const auto& value = my_map.at(my_key); }
性能对比分析
从性能维度看,方案1明显更优,核心原因如下:
- 方案1仅执行一次哈希表查找:
find方法通过哈希计算定位到目标元素所在的桶,找到元素后直接通过迭代器访问对应的值,全程没有重复的哈希计算和桶遍历操作。 - 方案2会触发两次完整的哈希表查找:第一次调用
contains完成存在性检查,第二次调用at会重新计算哈希、遍历桶并定位元素。哪怕哈希计算的开销不算高,两次查找带来的重复操作,在数据量较大或高频调用的场景下,性能损耗会被显著放大。
如果你的业务场景对性能要求不苛刻,方案2的可读性优势确实值得选择,代码简洁直观;但追求极致性能的场景下,方案1是更稳妥的选择。
内容的提问来源于stack exchange,提问作者Philip Z.
相关产品推荐
相关产品推荐

