在remove_if中否定谓词

时间:2013-01-08 16:35:22

标签: c++ algorithm stl

我尝试使用vector :: erase和std :: remove_if从矢量中删除对象。我有一个外部命名空间来执行选择ala:

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。

由于

1 个答案:

答案 0 :(得分:7)

使用std::not1适配器否定isValid函数返回的值。请注意,std::not1需要一个函数 object (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() );