我对现代 C++ 比较陌生,并且使用外国代码库。有一个函数接受 std::unordered_map 并检查映射中是否存在键。代码大致如下
uint32_t getId(std::unordered_map<uint32_t, uint32_t> &myMap, uint32_t id)
{
if(myMap.contains(id))
{
return myMap.at(id);
}
else
{
std::cerr << "\n\n\nOut of Range error for map: "<< id << "\t not found" << std::flush;
exit(74);
}
}
Run Code Online (Sandbox Code Playgroud)
似乎调用contains()后面的at()效率很低,因为它需要双重查找。所以,我的问题是,实现这一目标最有效的方法是什么?我还有一个后续问题:假设地图相当大(~60k 元素)并且此方法被频繁调用,上述方法有多大问题?
经过一番搜索,似乎以下范例比上面的更有效,但我不确定哪个是最好的。
在构造myMap.at()内部调用try-catch
at如果键不存在,会自动抛出错误try-catch显然成本相当高,并且还限制了优化器可以对代码执行的操作使用find
try-catch开销 auto findit = myMap.find(id);
if(findit == myMap.end())
{
//error message;
exit(74);
}
else
{
return findit->first;
}
Run Code Online (Sandbox Code Playgroud)