1

述語の 2 つのベクトルがあります。

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

vector<pred> v1;
vector<pred> v2;

それらを 1 つにマージする必要がありますが、2 番目のベクトルからの述語は反転する必要があります (つまり、通常は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 に答える