如何在std :: vector<>中反转每个谓词的意义他们?

时间:2012-06-09 13:05:37

标签: c++ functional-programming predicate

我有两个谓词向量:

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。

3 个答案:

答案 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一起使用,这些函数应该完全用于您的目的。

这几乎是参考代码!