web-dev-qa-db-fra.com

Qu'est-ce qu'un prédicat en C ++?

Pouvez-vous donner un exemple ou un lien vers un sujet.

34
munish

Un prédicat est une fonction C++ renvoyant un booléen ou un objet ayant un membre bool operator(). Un prédicat unaire prend un argument, un binaire en prend deux, et ainsi de suite. Voici des exemples de questions auxquelles les prédicats peuvent répondre pour un algorithme particulier:

  • Cet élément est-il ce que nous recherchons?
  • Le premier des deux arguments est-il ordonné en premier dans notre commande?
  • Les deux arguments sont-ils égaux?

Presque tous algorithmes STL prennent un prédicat comme dernier argument.

Vous pouvez construire de nouveaux prédicats à l'aide de classes standard, auto-définies et/ou de création de prédicats ( voici une bonne référence ).

43
Andrey Sidorov

La norme C++ définit Predicate comme suit (25/7):

Le paramètre Predicate est utilisé chaque fois qu'un algorithme attend un objet fonction qui, appliqué au résultat du déréférencement, l'itérateur correspondant renvoie une valeur testable comme vraie. En d'autres termes, si un algorithme prend Predicate pred comme argument et d'abord comme argument itérateur, il devrait fonctionner correctement dans la construction if (pred(*first)){...}. L'objet fonction pred ne doit appliquer aucune fonction non constante via l'itérateur déréférencé. Cet objet fonction peut être un pointeur vers une fonction, ou un objet d'un type avec un opérateur d'appel de fonction approprié.

Il existe une définition analogue de BinaryPredicate avec deux paramètres.

Donc en anglais, c'est une fonction ou un objet avec une surcharge operator(), qui:

  • prend un seul paramètre. Dans le cas des algorithmes, le type de paramètre est implicitement convertible à partir du type de l'itérateur déréférencé de l'algorithme en question, ou est une référence const à un tel type, ou à un Push, il peut s'agir d'une référence non const à l'exact tapez tant que l'itérateur n'est pas un const_iterator.
  • renvoie une valeur qui peut être testée pour la vérité dans une instruction if (et donc à cause des règles de langage de C++, également dans une boucle while et ainsi de suite).
  • ne modifie pas ses arguments (du moins pas tant que le type de paramètre est const-correct ...)

De plus, comme de nombreux algorithmes ne spécifient pas l'ordre exact des opérations qu'ils effectuent, vous pouvez constater que vous obtenez un comportement imprévisible si votre prédicat n'est pas cohérent, c'est-à-dire si le résultat dépend de quelque chose d'autre que la valeur d'entrée qui peut changer entre les appels .

Outre les algorithmes, le négateur logique not1 dans <functional> prend un paramètre de modèle Predicate. Dans ce cas, il y a une exigence supplémentaire (20,3/5):

Pour permettre aux adaptateurs et autres composants de manipuler des objets fonction qui prennent un ou deux arguments, il est nécessaire que les objets fonction fournissent de manière correspondante typedefs argument_type et result_type pour les objets fonction qui prennent un argument et first_argument_type, second_argument_type et result_type pour les objets fonction qui prennent deux arguments .

11
Steve Jessop

Il n'est pas spécifique au C++ (ni même aux langages informatiques). Dans la grammaire du langage naturel, dans une instruction telle que la porte est ouverte, la partie est ouverte est le prédicat et est soit vraie soit fausse, alors disons que vous aviez une classe cGate, avec une fonction membre bool cGate::isOpen(), une telle fonction serait un prédicat.

Essentiellement, si la fonction pose une question sur l'état ou la valeur de l'objet et que le résultat est vrai ou faux, c'est un prédicat.

8
Clifford

Un prédicat est simplement une fonction qui renvoie vrai ou faux selon que ses entrées satisfont à une condition. En général, une fonction de prédicat doit être pure; il devrait toujours retourner le même résultat quand on lui donne la même entrée (donc bool isDateInPast(Date &date) serait un prédicat mauvais).

Ils sont souvent utilisés, par exemple, comme rappels pour les routines de tri STL (c'est-à-dire "l'entrée a est-elle inférieure à l'entrée b?").

7