在 C++ 映射中,使用 find_if 或 find then 和 .at 更适合使用/性能并且符合指南

Muh*_*suf 4 c++ c++11

我正在使用 C++ 映射,其中我需要搜索一个元素,然后获取该元素(如果存在)。

第一种方法是使用 find

if (mymap.find(mykey) == mymap.end()) 
{
    //return error code
    return ERROR_CODE;
}
else
{
    value = mymap.at(mykey).second;
    return SUCCESS_CODE;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:

auto iter= find_if(mymap.begin(), mymap.end(), [&key](auto &item){return item.first == key;})
if(iter == mymap.end())
{
   return ERROR_CODE;
}
else
{
    value = iter->second;
    return SUCCESS_CODE;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何技术考虑或指南(如 cpp 指南)提到类似的内容,哪种方法更好?

Jar*_*d42 9

您不应该使用std::find_if线性的迭代器,而您可能会使用对数时间的迭代器。你可能会做

auto it = mymap.find(mykey)
if (it == mymap.end()) 
{
    //return error code
    return ERROR_CODE;
}
else
{
    value = it->second;
    return SUCCESS_CODE;
}
Run Code Online (Sandbox Code Playgroud)

  • 也许值得一提的是,如果“map.find”不如通用算法好或更好,那么它首先就不会存在。例如,既没有“std::vector::find”,因为它不可能比“std::find”更好,也没有“std::list::find”,因为它和使用“std::find”一样差。在名单上。 (3认同)
  • 旁白:在 C++ 17 及更高版本中,我会将初始化程序移至“if”中 (2认同)