这可能是一个愚蠢的问题,但只是想知道是否有任何解决方法。 :)C++如何在谓词中使用“NOT”(!)?
有什么办法在谓词有“不”吗?
例子:
std::remove_if(s.begin(), s.end(), !IsCorrect);
// ^
或者说,我一定要创造反正功能IsNotCorrect?
这可能是一个愚蠢的问题,但只是想知道是否有任何解决方法。 :)C++如何在谓词中使用“NOT”(!)?
有什么办法在谓词有“不”吗?
例子:
std::remove_if(s.begin(), s.end(), !IsCorrect);
// ^
或者说,我一定要创造反正功能IsNotCorrect?
可以使用std::not1
,这否定一个元谓词做到这一点:
#include <functional>
std::remove_if(s.begin(), s.end(), std::not1(std::ptr_fun(IsCorrect)));
如果IsCorrect
是一个适配功能,那么你就不需要ptr_fun
,但如果它只是一个普通的功能,那么你做的。
太棒了.. – 2010-10-30 19:59:05
请注意'std :: ptr_fun'已弃用。我认为'std :: ref'可以在这里作为替换。 – ECrownofFire 2013-12-18 23:18:29
@ECrownofFire:对,在C++ 11中''ptr_fun'已经过时了。我想原则上有一个项目供某人使用,在2011年之前通过所有关于SO问题的C++问题,并用C++ 11(和/或C++ 14)等价物更新他们的答案,其中提供了更好的解决方案;-) – 2013-12-18 23:24:06
你也可以尝试brutforce这样对任何谓词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...); }
的可能重复[我怎样可以在C否定算符++(STL)?](http://stackoverflow.com/questions/265228/how-can-i-negate-a-functor-in-c-stl) – kennytm 2010-10-30 19:53:16