取消引用std :: find_if的结果时内存访问不正确

Sur*_*ani 1 c++ debugging

bool hasId(string id, vector<User>& map)
{
    User ans = *(find_if(map.begin(), map.end(), [&](User d)
    {   return (id==(d).uid());}));
    return ans.uid() == id;
}
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 5

如果没有找到匹配项,那么在您的情况下find_if返回. 不返回有效的迭代器(它是一个超过最后一个元素的迭代器),但是您假设始终找到匹配并继续无条件地取消引用返回值.这是个问题. last()map.end()end()

您需要在取消引用之前执行检查.如果没有检查,你的函数就会假设总是找到一个匹配ans.uid() == id的谓词find_if(因此是多余的),所以你也可以用return true;它来代替整个东西:)

bool hasId(string id, vector<User>& map)
{
    return map.end() != find_if(map.begin(), map.end(), [&](User d)
    {   
        return id == d.uid();
    });   
}
Run Code Online (Sandbox Code Playgroud)

另一方面,打电话给vectora map,有点奇怪,至少令人困惑.


find_if的文档

相关位:

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
Run Code Online (Sandbox Code Playgroud)

返回值

Iterator到满足条件的第一个元素,如果没有找到这样的元素则为last.