remove_if 中的否定谓词
Posted
技术标签:
【中文标题】remove_if 中的否定谓词【英文标题】:Negate predicate in remove_if 【发布时间】:2013-01-08 16:35:21 【问题描述】:我尝试使用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。
谢谢
【问题讨论】:
使用std::not1<isValid>
为了未来读者的利益:std::not_fn
in C++17。
【参考方案1】:
使用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() );
【讨论】:
非常感谢使用 std::ptr_fun 的提示。这终于解决了剩下的编译错误! 我认为在 C++11 中,您也可以将函数指针传递给std::not1
。此外,std::ptr_fun
在 C++11 中已弃用,优先于 std::mem_fn
。还有一个名为std::mem_fun
的类似名称 函数模板,它也被弃用。
@Nawaz:对,唉,C++11 糖果在这里没用,因为 OP 写道“不幸的是,目前在这种情况下不支持 C++11。”。
对。代码必须在不提供任何最新 gcc 版本的网格系统上运行。因此,唯一的选择是 boost,但 std::ptr_fun 工作得很好。以上是关于remove_if 中的否定谓词的主要内容,如果未能解决你的问题,请参考以下文章