Was ist Prädikat in C++?

Was ist Prädikat in C++?

Ein Prädikat ist eine C++-Funktion, die einen booleschen Wert oder ein Objekt mit einem bool operator() zurückgibt member. Ein unäres Prädikat benötigt ein Argument, ein binäres zwei und so weiter. Beispiele für Fragen, die Prädikate für einen bestimmten Algorithmus beantworten können, sind:

  • Ist dieses Element das, wonach wir suchen?
  • Ist das erste von zwei Argumenten in unserer Reihenfolge an erster Stelle?
  • Sind die beiden Argumente gleich?

Fast alle STL-Algorithmen nehmen als letztes Argument ein Prädikat.

Sie können neue Prädikate erstellen, indem Sie standardmäßige, selbst definierte und/oder prädikaterzeugende Klassen verwenden (hier ist eine gute Referenz).


Der C++-Standard definiert Predicate wie folgt (25/7):

Es gibt eine analoge Definition von BinaryPredicate mit zwei Parametern.

Auf Englisch ist es also eine Funktion oder ein Objekt mit einem operator() überladen, dass:

  • nimmt einen einzelnen Parameter an. Im Fall von Algorithmen ist der Parametertyp implizit vom Typ des dereferenzierten Iterators des betreffenden Algorithmus konvertierbar oder eine konstante Referenz auf einen solchen Typ oder kann auf Knopfdruck eine nicht konstante Referenz auf den exakten sein type solange der Iterator kein const_iterator ist.
  • gibt einen Wert zurück, der in einem if auf Wahrheit getestet werden kann -Anweisung (und damit wegen der Sprachregeln von C++ auch in einem while Schleife usw.).
  • ändert seine Argumente nicht (zumindest nicht, solange der Parametertyp konstant-korrekt ist...)

Da viele Algorithmen die genaue Reihenfolge der von ihnen ausgeführten Operationen nicht angeben, kann es außerdem vorkommen, dass Sie ein unvorhersehbares Verhalten erhalten, wenn Ihr Prädikat nicht konsistent ist, d. h. wenn das Ergebnis von etwas anderem als dem Eingabewert abhängt, der sich zwischen Aufrufen ändern kann .

Neben Algorithmen der logische Negator not1 in <functional> nimmt einen Predicate Vorlagenparameter. In diesem Fall gibt es eine zusätzliche Anforderung (20.3/5):


Es ist nicht spezifisch für C++ (oder sogar Computersprachen). In der Grammatik natürlicher Sprache in einer Anweisung wie dem Tor ist offen , das ist geöffnet part ist das Prädikat und ist entweder wahr oder falsch, also sagen wir, Sie hätten eine Klasse cGate , mit einer Mitgliedsfunktion bool cGate::isOpen() , wäre eine solche Funktion ein Prädikat.

Wenn die Funktion eine Frage zum Objektstatus oder -wert stellt und das Ergebnis entweder wahr oder falsch ist, handelt es sich im Wesentlichen um ein Prädikat.