質問

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ファンサーを書くことが最善の策だと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top