1

我有两个谓词向量:

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。

4

3 回答 3

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());
于 2012-06-09T13:23:37.360 回答
3

标准库有一个std::not1谓词,它接受一元谓词并产生参数的否定,因此无需为此提供您自己的函子[代码未经测试,您可能需要更正语法]:

std::transform( v.begin(), v.end(), v.begin(), 
                std::not1< std::function<bool(int)> > );
于 2012-06-09T13:31:47.873 回答
2

我想不出更好的方法来解决你的问题。

您实际上将一个transformer函数与stl::transform应该完全用于您的目的的函数一起使用。

这几乎是可观的参考代码!

于 2012-06-09T13:14:41.417 回答