This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center




已关闭8年。



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;
}

最佳答案

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

您需要在取消引用之前执行检查。没有检查,您的函数只是假设总是找到一个匹配项,因为ans.uid() == idfind_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();
    });
}

顺便说一句,至少把vector称为map有点奇怪。

Documentation for find_if

相关位:
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

关于c++ - 取消引用std::find_if的结果时,内存访问错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13169396/

10-10 01:54