web-dev-qa-db-ja.com

C ++の述語とは何ですか?

いくつかの例やトピックへのリンクを教えてください。

34
munish

述語は、ブール値またはbool operator()メンバーを持つオブジェクトを返すC++関数です。単項述語は1つの引数を取り、バイナリは2つの引数を取ります。特定のアルゴリズムについて述語が回答できる質問の例は次のとおりです。

  • この要素は私たちが探しているものですか?
  • 2つの引数のうち最初の引数が最初に順序付けられていますか?
  • 2つの引数は等しいですか?

ほとんどすべて STLアルゴリズム は、最後の引数として述語を取ります。

標準、自己定義、および/または述語作成クラスを使用して、新しい述語を構築できます( こちらが良いリファレンスです )。

43
Andrey Sidorov

C++標準では、Predicateを次のように定義しています(25/7):

Predicateパラメーターは、アルゴリズムが、対応する反復子の逆参照の結果に適用されたときにtrueとしてテスト可能な値を返す関数オブジェクトを予期する場合に使用されます。言い換えると、アルゴリズムがPredicate predを引数として使用し、最初に反復子引数を使用する場合、アルゴリズムはif (pred(*first)){...}構造で正しく動作するはずです。関数オブジェクトpredは、参照解除された反復子を介して非定数関数を適用しません。この関数オブジェクトは、関数へのポインター、または適切な関数呼び出し演算子を持つ型のオブジェクトです。

2つのパラメーターを持つBinaryPredicateの類似した定義があります。

したがって、英語では、それはoperator()オーバーロードを持つ関数またはオブジェクトです。

  • 単一のパラメーターを取ります。アルゴリズムの場合、パラメーターの型は、問題のアルゴリズムの間接参照された反復子の型から暗黙的に変換可能であるか、そのような型へのconst参照であるか、Pushでは正確な非const参照になりますイテレータがconst_iteratorでない限り入力してください。
  • ifステートメントで真理をテストできる値を返します(したがって、C++の言語規則のため、whileループなどでも)。
  • 引数を変更しません(少なくとも、パラメータタイプがconst-correctである限り)。

さらに、多くのアルゴリズムは実行する操作の正確な順序を指定しないため、述語に一貫性がない場合、つまり結果が呼び出し間で変化する可能性のある入力値以外に依存する場合、予測できない動作が発生することがあります。

アルゴリズムと同様に、論理否定子not1 in <functional>は、Predicateテンプレートパラメータを取ります。その場合、追加の要件(20.3/5)があります。

アダプターおよび他のコンポーネントが1つまたは2つの引数を取る関数オブジェクトを操作できるようにするには、関数オブジェクトが、1つの引数を取る関数オブジェクトにtypedefs argument_typeおよびresult_typeを提供し、2つの引数を取る関数オブジェクトにfirst_argument_type、second_argument_type、およびresult_typeを提供する必要があります。

11
Steve Jessop

C++(またはコンピューター言語)に固有のものではありません。自然言語の文法では、gate is openなどのステートメントで、is open部分は述語であり、trueまたはfalseであるため、クラスcGateがあったとします、メンバー関数bool cGate::isOpen()では、そのような関数は述語になります。

基本的に、関数がオブジェクトの状態または値について質問し、結果がtrueまたはfalseの場合、それは述語です。

8
Clifford

述語は、入力が条件を満たしているかどうかに応じてtrueまたはfalseを返す単純な関数です。一般的に、述語関数はpure;でなければなりません。 always同じ入力が与えられたときに同じ結果を返す必要があります(したがって、bool isDateInPast(Date &date)bad述語になります)。

たとえば、STLソートルーチンのコールバックとして使用されることがよくあります(つまり、「入力aは入力b?より小さい」)。

7