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;
}
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
で、少なくとも混乱します。
関連ビット:
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 に答える