这可能是一个愚蠢的问题,但我想知道是否有任何解决方法。 :)
在谓词中是否有任何方法可以使用“Not”?
例如:
std::remove_if(s.begin(), s.end(), !IsCorrect);
// ^
或者,我是否仍然需要创建 IsNotCorrect 函数呢?
这可能是一个愚蠢的问题,但我想知道是否有任何解决方法。 :)
在谓词中是否有任何方法可以使用“Not”?
例如:
std::remove_if(s.begin(), s.end(), !IsCorrect);
// ^
您可以使用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
可以作为替代品。 - ECrownofFireptr_fun
在C++11中已经过时了。我想原则上来说,有人可以为此着手一个项目,浏览SO上2011年之前提出的所有C++问题,并在更好的解决方案可用的情况下更新它们的答案为C++11(和/或C++14)等价物;-) - Steve Jessop你也可以像这样尝试在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...); }