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适配器来否定函数返回的值isValid。请注意,它std::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 回答