Ver Mensaje Individual
  #10 (permalink)  
Antiguo 12/11/2015, 16:15
Avatar de xKuZz
xKuZz
 
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Ejercicio usando Colas en C++

Para utilizar priority_queue y poner una relación de prioridad personalizada debes pasar al template (Linea 22 de código 1)como primer argumento el tipo de dato, como segundo argumento un contenedor de ese tipo de dato (en este caso uso un vector no olvides #include<vector>) y como tercer argumento el functor.

Te voy a mostrar la alternativa clásica y una versión C++11 de tu código para que veas y compares diferencias. Si no entiendes nada de C++11 te costará entender el segundo código.

¿Qué es un functor?
Es una objeto (instancia de clase) que actúa como una función. La principal ventaja que tienen es que al ser una clase pueden almacenar un estado. La STL los utiliza mucho y para crear uno lo que debes de hacer es una clase en la que esté sobrecargado el operador paréntesis.

Como siempre esto se ve mejor con un ejemplo. Para que sea sencillo voy imprimir una secuencia de enteros. En mi caso va a tener menos prioridad el que sea mayor en el orden usual. Es decir que saldrá antes el número más chico.
Código C++:
Ver original
  1. #include <queue>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. class prioridad { // Implementamos el functor
  9.     public:
  10.         bool operator()(const int &a, const int &b){
  11.         // Aquí va la función de prioridad.
  12.         return a>b; // Tengo menos prioridad si soy un entero mayor
  13.         }
  14. };
  15.  
  16. int main(){ // Para no liarte reutilizo tu código
  17.     //Declaración de variables
  18.         int i, Numero;
  19.         srand(time(NULL));
  20.  
  21.         // MIRAR AQUI: TERCER ARGUMENTO PASAMOS EL FUNCTOR
  22.         priority_queue<int,vector<int>,prioridad> numero_aleatorio;
  23.  
  24.         //Procesamiento
  25.         for(i = 1; i <= 100; i++)
  26.         {
  27.             //Generamos un número aleatorio del 1 al 500
  28.             Numero = 1 + rand() % (501 - 1);
  29.  
  30.             //Guardamos el número generado
  31.             numero_aleatorio.push(Numero);
  32.         }
  33.  
  34.         while (!numero_aleatorio.empty())
  35.         {
  36.             cout << numero_aleatorio.top() << ", ";
  37.             numero_aleatorio.pop();
  38.         }
  39. }

En C++11 tienes otras opciones como las lambdas (tienes sus ventajas y sus incovenientes), si por cualquier casualidad sabes usarlas aquí tienes un ejemplo:

Código C++:
Ver original
  1. #include <random>
  2. #include <queue>
  3. #include <iostream>
  4.  
  5. #include <vector>
  6. using namespace std;
  7.  
  8. int main(){
  9.         // Generador de enteros aleatorios del 1 al 500
  10.         default_random_engine aleatorio;
  11.         uniform_int_distribution<int> entero(1, 500);
  12.  
  13.         // Creamos la lambda que define la prioridad
  14.         auto prioridad= [] (const int &a, const int &b) {
  15.                                      return a>b;
  16.                             };
  17.         // Por lo que podría llamarla así
  18.         priority_queue<int,vector<int>,decltype(prioridad)> cola(prioridad);
  19.  
  20.         // También puedes declarar variables locales al bucle tal que
  21.         // (para eso no hace falta C++11)
  22.        
  23.         for(int i = 0; i < 100; ++i)
  24.             cola.push(entero(aleatorio)); // Añado a la cola enteros aleatorios entre 1 y 500
  25.  
  26.  
  27.         while (!cola.empty())
  28.         {
  29.             cout << cola.top() << ", ";
  30.             cola.pop();
  31.         }
  32. }

Última edición por xKuZz; 12/11/2015 a las 16:22