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返します。 は有効なイテレータ(最後の要素を1つ過ぎたもの)を返しませんが、一致するものが常に見つかると想定し、無条件に戻り値の逆参照に進みます。これは問題だ。 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 に答える