usando función de comparación en el recipiente stl
-
10-10-2019 - |
Pregunta
¿Por qué puedo hacer esto:
stable_sort(it1, it2, binary_function);
pero no esto:
priority_queue<type, vector<type>, binary_function> pq;
¿Por qué puedo utilizar una función en el primer caso, pero necesitan un objeto en el segundo?
Solución
Si usted echa un vistazo a la referencia en std::stable_sort
, verá que el binary_function
le ha proporcionado , debe ser un objeto de la función, así ... no hay ninguna diferencia entre los dos, excepto que tal vez en el segundo caso no hay un "molde" adecuada o la conversión a partir de una función a un objeto de función apropiada.
Creo que esto puede ser debido al hecho de que las funciones *sort
utilizan el funtor directamente, e inmediatamente, por lo tanto, si la dirección de la función es válida cuando la función se llama *sort
, será válido para la duración de la llamada a la función. Al crear un contenedor que utiliza esto como un miembro de datos (en esencia), no se puede estar seguro de la referencia de la función será invalidado durante el tiempo de vida del objeto contenedor. Sé que es una explicación handwaving flojo, pero es lo mejor que puedo llegar a. Quizá en C ++ la referencia a una función binaria se convertirá implícitamente a la construcción de un std::function
de modo que la función se "copia" y no hay ningún problema de validez.
Espero que no he perdido ahora ...
Otros consejos
priority_queue
es una plantilla y que espera un tipo como un argumento, donde se binary_function
es un objeto de función.