map/unordered_map:首选find(),然后at()或try at() catch out_of_rang

map/unordered_map: Prefer find() and then at() or try at() catch out_of_range?

本文关键字:map at try out rang of catch 然后 首选 find unordered      更新时间:2023-10-16

当使用std::mapstd::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
}

我建议秘密选项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++中,使用异常处理进行流控制并不是习惯用法,这是第二个代码示例所做的。它将使维护者更难理解代码,并且根据特定的编译器,它可能执行得不那么好。