C++中std::map两种查找方式:contains判断vs异常捕获,哪种更高效?
C++两种map查找写法的效率对比
先明确两种写法的逻辑:
- 写法一:先调用
my_map.contains(my_key)判断key是否存在,存在则用at()返回对应值 - 写法二:直接调用
at(),通过try-catch捕获std::out_of_range异常处理key不存在的情况
效率差异核心:key存在的概率
- 当key大概率存在时:写法一需要执行两次查找(
contains和at各一次),而写法二仅需一次查找。这种场景下写法二更高效——不管是unordered_map的哈希计算,还是map的红黑树遍历,重复执行都会产生额外开销。 - 当key大概率不存在时:写法一的
contains会快速返回false,无需进入后续逻辑;但写法二会触发异常,异常的抛出与捕获本身存在栈展开、异常对象构造等额外开销,这种情况写法一效率更高。
额外更优写法推荐
如果你的需求是「存在则返回值,不存在则处理默认逻辑」,更推荐使用find方法,仅需一次查找:
auto it = my_map.find(my_key); if (it != my_map.end()) return it->second; // 处理key不存在的逻辑
这种写法无论key存在与否都只执行一次查找,既避免了重复操作,也没有异常开销,可读性更强。
另外要注意:异常机制的设计初衷是处理小概率异常情况,如果key不存在属于常规业务场景,使用try-catch不仅效率低下,代码逻辑也会显得生硬。
内容的提问来源于stack exchange,提问作者Grigorii Sokolik
相关产品推荐
相关产品推荐

