我有两个谓词向量:
typedef std::function<bool(int)> pred;
vector<pred> v1;
vector<pred> v2;
我需要将它们合并为一个,但是第二个向量的谓词应该被反转(即在它们正常返回true
的情况下它们应该返回false
)。所以,实际上我需要一种“反转”包装。
我创建了一个反转函数和一个包含原始谓词并反转其值的结构:
struct inverted
{
pred pr;
inverted(pred pr_) : pr(pr_) {}
bool operator () (int i) {return !pr(i);}
};
pred CreateInverted(pred pr)
{
return inverted(pr);
}
使用它,矢量谓词的反转可能如下所示:
transform( v2.begin(), v2.end(), v2.begin(), CreateInverted );
但我想知道是否有更好的解决方案,特别是基于标准库?
没有C ++ 11,允许Boost。
答案 0 :(得分:4)
如果您的谓词遵循某些约定,则可以使用std::not1
创建反向谓词。这是一个例子:
struct foobar : std::unary_function<bool, int>
{
bool operator()(int value) const { return value > 42; }
};
do_something_if(values.begin(), values.end(), std::not1(foobar());
答案 1 :(得分:3)
标准库有一个std::not1
谓词,它接受一元谓词并产生对参数的否定,因此不需要为此提供自己的仿函数[代码未经过测试,您可能需要更正语法]:
std::transform( v.begin(), v.end(), v.begin(),
std::not1< std::function<bool(int)> > );
答案 2 :(得分:2)
我想不出更好的方法来解决你的问题。
您实际上将transformer
函数与stl::transform
一起使用,这些函数应该完全用于您的目的。
这几乎是参考代码!