remove_ifをremove_not_ifに変換します
-
28-09-2019 - |
質問
Predicateの戻り値を逆にして、trueの代わりにFalseを返す要素を削除するにはどうすればよいですか?
これが私のコードです:
headerList.remove_if(FindName(name));
(消去の欠如を無視してください)
FindNameでシンプルなファンチャー:
struct FindName
{
CString m_NameToFind;
FindInspectionNames(const CString &nameToFind)
{
m_NameToFind = nameToFind;
}
bool operator()(const CHeader &header)
{
if(header.Name == m_NameToFind)
{
return true;
}
return false;
}
};
私は次のようなものが欲しいです:
list.remove_if(FindName(name) == false);
まだC ++ 0xを使用していないため、Lambdasは許可されていません。 NotFindNameファンクターを書くよりも良い解決策があることを願っています。
解決
小切手 not1
の中に <functional>
ヘッダ:
headerList.remove_if( std::not1( FindName( name ) ) );
ああ、これ:
if(header.Name == m_NameToFind)
{
return true;
}
return false;
お願いします それをしないでください。
return ( header.Name == m_NameToFind );
そうです 多くの より良いですね。
他のヒント
または、Boost Bindを使用して、そのunary_function structを記述する必要はありません。
bool header_has_name (const CHeader& h, const CString& n) {return h.name == n;}
headerList.remove_if (boost::bind (header_has_name, _1, "name"));
remove_if_notの場合:
headerList.remove_if (!boost::bind (header_has_name, _1, "name"));
std :: equal()を使用して、header_has_name関数を完全に回避することもできますが、その時点では少し醜くなります。
残念ながら、notfindnameファンサーを書くことが最善の策だと思います。
所属していません StackOverflow