¿Qué es predicado en C++? [cerrado]


Puede dar algún ejemplo o un enlace a un tema.

Author: Marc Mutz - mmutz, 2011-05-07

4 answers

Predicate es una función de C++ que devuelve booleano o instancia de objeto que tiene un miembro bool operator (). El predicado unario toma un agrupamiento, binario-dos, etc. Ejemplos de preguntas que los predicados pueden responder para un algoritmo particular son:

  • ¿Es este elemento lo que estamos buscando?
  • ¿El primero de los dos argumentos se ordena primero en nuestro orden?
  • ¿Son los dos argumentos iguales?

Casi todos los algoritmos STL toman el predicado como último argumento.

Puede construir nuevos predicados usando clases estándar, propias y de creación de predicados ( aquí hay una buena referencia).

 34
Author: Andrey Sidorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-01 18:02:36

El estándar de C++ define Predicate como sigue (25/7):

Se utiliza el parámetro Predicado cuando un algoritmo espera un objeto de función que cuando se aplica a el resultado de desreferenciar el el iterador correspondiente devuelve un valor comprobable como verdadero. En otras palabras, si un algoritmo toma pred Predicado como su argumento y primero como su iterador argumento, debería funcionar correctamente en la construcción if (pred(*first)){...}. El objeto de la función pred no aplicar cualquier función no constante a través del iterador desreferenciado. Este objeto de función puede ser un puntero para funcionar, o un objeto de un tipo con una llamada de función apropiada operador.

Hay una definición análoga de BinaryPredicate con dos parámetros.

Así que en inglés, es una función o un objeto con una sobrecarga operator(), que:

  • toma un solo parámetro. En el caso de los algoritmos, el tipo de parámetro es implícitamente convertible del tipo de iterador desreferenciado del algoritmo en cuestión, o es una referencia const a tal tipo, o en un push puede ser una referencia no-const al tipo exacto siempre y cuando el iterador no sea un const_iterator.
  • devuelve un valor que puede ser probado para la verdad en una instrucción if (y por lo tanto debido a las reglas del lenguaje de C++, también en un bucle while y así sucesivamente).
  • no modifica sus argumentos (al menos, no mientras el tipo de parámetro sea correcto...)

Además, dado que muchos algoritmos no especifican el orden exacto de las operaciones que realizan, es posible que obtenga un comportamiento impredecible si su predicado no es consistente, es decir, si el resultado depende de algo que no sea el valor de entrada que puede cambiar entre llamadas.

Además de los algoritmos, el negador lógico not1 en <functional> toma un parámetro de plantilla Predicate. En ese caso, hay un requisito adicional (20.3/5):

Para habilitar adaptadores y otros componentes para manipular la función objetos que toman uno o dos argumentos se requiere que la función los objetos proporcionan correspondientemente typedefs argument_type y result_type para objetos de función que toman uno argumento y first_argument_type, second_argument_type, y result_type para objetos de función que toman dos argumento.

 9
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-07 16:25:02

Un predicado es simplemente una función que devuelve true o false dependiendo de si sus entradas satisfacen alguna condición. En general, una función predicada debe ser pura; debe siempre devolver el mismo resultado cuando se le da la misma entrada (por lo que bool isDateInPast(Date &date) sería un malo predicado).

Se usan a menudo, por ejemplo, como devoluciones de llamada para rutinas de clasificación STL (es decir, "is input a less than input b?").

 7
Author: Oliver Charlesworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-07 14:24:55

No es específico de C++ (ni siquiera de lenguajes de programación). En la gramática del lenguaje natural, en una declaración como la puerta es abierta, la parte es abierta es el predicado y es verdadero o falso, así que digamos que tienes una clase cGate, con una función miembro bool cGate::isOpen(), tal función sería un predicado.

Esencialmente si la función hace una pregunta sobre el estado o valor del objeto y el resultado es verdadero o falso, entonces es un predicado.

 5
Author: Clifford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-07 16:05:31