Wat is predikaat in C++?

Kun je een voorbeeld of een link naar een onderwerp geven.


Antwoord 1, autoriteit 100%

Een predikaat is een C++-functie die een boolean of een object met een bool operator()-lid retourneert.
Een unair predikaat heeft één argument, een binair predikaat heeft er twee, enzovoort.
Voorbeelden van vragen die predikaten kunnen beantwoorden voor een bepaald algoritme zijn:

  • Is dit element wat we zoeken?
  • Is de eerste van twee argumenten als eerste in onze volgorde geordend?
  • Zijn de twee argumenten gelijk?

Bijna alle STL-algoritmennemen een predikaat als laatste argument.

Je kunt nieuwe predikaten construeren met behulp van standaard, zelf gedefinieerde en/of predikaatmakende klassen (hier is een goede referentie).


Antwoord 2, autoriteit 25%

De C++-standaard definieert Predicateals volgt (25/7):

De predikaatparameter wordt gebruikt
wanneer een algoritme een verwacht
functie-object dat wanneer toegepast op
het resultaat van de verwijzing naar de
corresponderende iterator retourneert een waarde
toetsbaar als waar. Met andere woorden, als
een algoritme neemt Predicaat pred als
zijn argument en eerst als zijn iterator
argument, het zou correct moeten werken in
de constructie if (pred(*first)){...}.
Het functie-object predmag niet
elke niet-constante functie toepassen
via de gederefereerde iterator.
Dit functie-object kan een aanwijzer zijn
om te functioneren, of een object van een type
met een passende functieaanroep
operator.

Er is een analoge definitie van BinaryPredicatemet twee parameters.

Dus in het Engels is het een functie of een object met een operator()overbelasting, die:

  • neemt een enkele parameter. In het geval van algoritmen is het parametertype impliciet converteerbaar van het type van de dereferenced iterator van het betreffende algoritme, of is het een const-referentie naar een dergelijk type, of bij een push kan het een non-const-referentie zijn naar de exacte type zolang de iterator geen const_iterator is.
  • retourneert een waarde die op waarheid kan worden getest in een if-instructie (en daarom vanwege de taalregels van C++ ook in een while-lus enzovoort).
  • wijzigt zijn argumenten niet (tenminste, niet zolang het parametertype const-correct is…)

Bovendien, aangezien veel algoritmen niet de exacte volgorde van bewerkingen die ze uitvoeren specificeren, kan het zijn dat u onvoorspelbaar gedrag krijgt als uw predikaat niet consistent is, dat wil zeggen als het resultaat afhankelijk is van iets anders dan de invoerwaarde die kan wisselen tussen gesprekken.

Naast algoritmen, neemt de logische negator not1in <functional>een sjabloonparameter Predicateaan. In dat geval is er een extra vereiste (20.3/5):

Adapters en andere inschakelen
componenten om de functie te manipuleren
objecten die een of twee argumenten hebben
het is vereist dat de functie:
objecten dienovereenkomstig bieden:
typedefs argument_type en resultaat_type
voor functie-objecten die één nemen
argument en eerste_argument_type,
second_argument_type en result_type
voor functie-objecten waarvoor twee . nodig is
argumenten.


Antwoord 3, autoriteit 17%

Het is niet specifiek voor C++ (of zelfs niet voor computertalen). In natuurlijke taalgrammatica, in een statement zoals de poort is open, is het is opendeel het predikaat en is het waar of onwaar, dus stel dat je een klasse cGate, met een lidfunctie bool cGate::isOpen(), zo’n functie zou een predikaat zijn.

Als de functie een vraag stelt over de objectstatus of -waarde en het resultaat is waar of onwaar, dan is het in wezen een predikaat.


Antwoord 4, autoriteit 13%

Een predikaat is gewoon een functie die waar of onwaar retourneert, afhankelijk van of de invoer(en) aan een voorwaarde voldoen. Over het algemeen moet een predikaatfunctie puurzijn; het zou altijdhetzelfde resultaat moeten retourneren wanneer dezelfde invoer wordt gegeven (dus bool isDateInPast(Date &date)zou een slechtpredikaat zijn).

Ze worden bijvoorbeeld vaak gebruikt als callbacks voor STL-sorteerroutines (dwz “is invoer akleiner dan invoer b?” ).

Other episodes