Pouvez-vous donner un exemple ou un lien vers un sujet.
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:
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 ).
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 fonctionpred
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:
if
(et donc à cause des règles de langage de C++, également dans une boucle while
et ainsi de suite).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 .
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.
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
?").