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

8

这可能是一个愚蠢的问题,但我想知道是否有任何解决方法。 :)

在谓词中是否有任何方法可以使用“Not”?

例如:

std::remove_if(s.begin(), s.end(), !IsCorrect); 
//                                 ^

或者,我是否仍然需要创建 IsNotCorrect 函数呢?

2个回答

18

您可以使用std::not1来实现,它会对一元谓词进行取反:

#include <functional>

std::remove_if(s.begin(), s.end(), std::not1(std::ptr_fun(IsCorrect)));
如果IsCorrect是一个可适应的函数,那么你不需要使用ptr_fun,但如果它只是一个普通的函数,则需要。

请注意,std::ptr_fun已被弃用。我认为std::ref可以作为替代品。 - ECrownofFire
@ECrownofFire:没错,ptr_fun在C++11中已经过时了。我想原则上来说,有人可以为此着手一个项目,浏览SO上2011年之前提出的所有C++问题,并在更好的解决方案可用的情况下更新它们的答案为C++11(和/或C++14)等价物;-) - Steve Jessop

1

你也可以像这样尝试在C++11中对任何谓词进行暴力搜索

template<class Predicate>
class not {
    //Has it's inverse predicate
    Predicate _Pred;
public:

    //Construct with arguments
    //required to construct _Pred
    template<class... Args>
    not(Args&&... args);

    //bool operator() with
    //_Pred arguments
    template<class... Args>
    bool operator()(Args&&... args) const;
};

template<class Predicate>
template<class... Args>
not<Predicate>::not(Args&&... args): _Pred(args...) {}

template<class Predicate>
template<class... Args>
bool not<Predicate>::operator()
    (
    Args&&... args
    ) const { return !_Pred(args...); }

1
最好在构造函数和函数调用运算符中都使用“std::forward<Args>(args)...”来转发参数。尽管如此,这仍然是一个不错的答案。 - Ash
@Ash 我是在开始学习可变参数模板的时候回答这个问题的。当然,应该使用转发。 - user2556165

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接