Map/unordered_map: Предпочитаете find(), а затем в() или попробуйте() 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
}

Ответ 1

Я предлагаю секретную опцию C, которая позволяет избежать как исключительных исключений, так и выполнять поиск дважды:

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

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

В С++ это не идиоматично использовать обработку исключений для управления потоком, что и делает второй пример кода. Это будет затруднять понимание разработчиками кода, и, в зависимости от конкретного компилятора, он может не работать также.