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

时间:2014-08-05 17:31:21

标签: c++ exception map unordered-map

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

即,

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

VS

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

1 个答案:

答案 0 :(得分:17)

我建议使用秘密选项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 ++中,对流控制使用异常处理并不是惯用的,这是第二个代码示例正在做的事情。它将使维护者更难理解代码,并且根据具体的编译器,它可能无法正常运行。