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

2 回答 2

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

vector在旁注中,调用a有点奇怪map,至少令人困惑。


find_if 的文档

相关位:

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

返回值

迭代到满足条件的第一个元素,如果没有找到这样的元素,则迭代到最后一个。

于 2012-11-01T00:40:58.590 回答
4

您的实现可能很简单:

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

但既然你无论如何都在使用 C++11,那么你可以只使用any_of

return any_of(map.begin(), map.end(), [&](User d){ return d.uid()==id; });
于 2012-11-01T00:55:37.323 回答