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

How to invert the sense of each predicate in a std::vector<> of them?

本文关键字:谓词 gt std vector lt      更新时间:2023-10-16

我有两个谓词向量:

typedef std::function<bool(int)> pred;
vector<pred> v1;
vector<pred> v2;

我需要将它们合并为一个,但是第二个向量的谓词应该反转(即在它们正常返回false的情况下,它们应该返回true)。所以,实际上我需要一种"反转"包装器。

我创建了一个反转函数和一个结构,它保存一个原始谓词并反转其值:

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,允许提升。

如果谓词遵循某些约定,则可以使用 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());

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

std::transform( v.begin(), v.end(), v.begin(), 
                std::not1< std::function<bool(int)> > );
我想不

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

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

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