1

vector::erase と std::remove_if を使用してベクターからオブジェクトを削除しようとしています。選択アラを行う外部名前空間があります:

template<unsigned int value, someType collection>
bool Namespace::isValid(const Foo* object){

   do something
}

これで、有効な場合にフィルタリングしたい要素を含むベクトルがあります。そうするために私は:

 std::vector<foo*> myVector;
 //fill it
 myVector.erase( std::remove_if(myVector.begin(), myVector.end(), Namespace::isValid<myValue, myCollectionType>), myVector.end());

これで問題なく動作し、すべての有効な候補が削除されますが、実際には他のすべてを保持して削除したいと考えています。したがって、述語を否定する必要があります。そうする方法はありますか?残念ながら、C++11 は現在、このコンテキストではサポートされていません。

ありがとう

4

1 に答える 1

7

アダプターを使用して、関数std::not1によって返される値を否定しますisValidstd::not1関数オブジェクトが必要であることに注意してください(C++ ではこれを「ファンクター」と呼びます)、名前空間に単純な関数がある場合はstd::ptr_fun、関数から関数オブジェクトを作成する必要もあります。

そう、

myVector.erase( std::remove_if( myVector.begin(),
                                myVector.end(),
                                Namespace::isValid<myValue, myCollectionType> ),
                myVector.end() );

になる

myVector.erase( std::remove_if( myVector.begin(),
                                myVector.end(),
                                std::not1( std::ptr_fun( Namespace::isValid<myValue, myCollectionType> ) ) ),
                myVector.end() );
于 2013-01-08T16:45:15.380 に答える