6

述語の戻り値を逆にして、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を使用していないため、ラムダは許可されていません。NotFindNameファンクターを作成するよりも優れたソリューションがあることを願っています。

4

3 に答える 3

15

ヘッダーをチェックnot1インします。<functional>

headerList.remove_if( std::not1( FindName( name ) ) );

ああ、そしてこれ:

if(header.Name == m_NameToFind)
{
    return true;
}

return false;

しないでください。

return ( header.Name == m_NameToFind );

それはずっといいですね。

于 2010-10-05T14:31:12.747 に答える
3

または、ブーストバインドを使用して、そのunary_function構造体を記述する必要がないようにすることもできます。

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関数を完全に回避することもできますが、その時点で少し見苦しくなります。

于 2010-10-05T15:42:07.590 に答える
0

残念ながら、NotFindNameファンクターを作成するのが最善の策だと思います。

于 2010-10-05T14:29:22.540 に答える