问题 map / unordered_map:首选find()然后at()或尝试at()catch out_of_range?


使用时 std::map 要么 std::unordered_map,访问可能不在容器中的元素的首选方法是什么?如果有人请求许可或要求宽恕?为什么?

那是,

if (mymap.find(key) != mymap.end()) {
    value = mymap.at(key);
    // do stuff
}
else {
    // do something else
}

try {
    value = mymap.at(key);
    // do stuff
}
catch(const std::out_of_range& oor) {
    // do something else
}

10105
2017-08-05 17:31


起源



答案:


我建议使用秘密选项C,它可以避免两种非例外情况并进行两次搜索:

MyMapType::const_iterator iter = mymap.find(key);

if(iter != mymap.end())
{
    // iter is item pair in the map. The value will be accessible as `iter->second`.
}

在C ++中,对流控制使用异常处理并不是惯用的,这是第二个代码示例正在进行的操作。它将使维护者更难理解代码,并且根据具体的编译器,它可能不会表现得那么好。


14
2017-08-05 17:34



+1:是的,我也一样。猜猜秘密出来了:( - Lightness Races in Orbit
查找之后的at确实是不必要的,但是这对捕获异常有什么好处? - Praxeolitic
我也喜欢用 insert 当我需要在地图中放置某些东西或更新现有项目时,阻止我们执行两次查找(或散列)。 auto result = m.insert(std::make_pair(key, value)); - Chad
@Praxeolitic异常带来了运行时成本(实际上,只要脚手架支付成本 try/catch 使用)。 - Chad
@Praxeolitic渔获物很贵。只应使用例外来处理 优秀 情况。如果你要描述容器缺少一个错误状态的元素,那么在()是合适的。 - QuestionC


答案:


我建议使用秘密选项C,它可以避免两种非例外情况并进行两次搜索:

MyMapType::const_iterator iter = mymap.find(key);

if(iter != mymap.end())
{
    // iter is item pair in the map. The value will be accessible as `iter->second`.
}

在C ++中,对流控制使用异常处理并不是惯用的,这是第二个代码示例正在进行的操作。它将使维护者更难理解代码,并且根据具体的编译器,它可能不会表现得那么好。


14
2017-08-05 17:34



+1:是的,我也一样。猜猜秘密出来了:( - Lightness Races in Orbit
查找之后的at确实是不必要的,但是这对捕获异常有什么好处? - Praxeolitic
我也喜欢用 insert 当我需要在地图中放置某些东西或更新现有项目时,阻止我们执行两次查找(或散列)。 auto result = m.insert(std::make_pair(key, value)); - Chad
@Praxeolitic异常带来了运行时成本(实际上,只要脚手架支付成本 try/catch 使用)。 - Chad
@Praxeolitic渔获物很贵。只应使用例外来处理 优秀 情况。如果你要描述容器缺少一个错误状态的元素,那么在()是合适的。 - QuestionC