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&lt;isValid&gt; 为了未来读者的利益: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 中的否定谓词的主要内容,如果未能解决你的问题,请参考以下文章

如何否定方法引用谓词

C ++如何在谓词中有“NOT”(!)?

从满足谓词的无序映射中删除元素

谓词逻辑 vs 自然语言

数据记录分层

人工智能导论——谓词公式化为子句集详细步骤