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#include <queue>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
class prioridad { // Implementamos el functor
public:
bool operator()(const int &a, const int &b){
// Aquí va la función de prioridad.
return a>b; // Tengo menos prioridad si soy un entero mayor
}
};
int main(){ // Para no liarte reutilizo tu código
//Declaración de variables
int i, Numero;
// MIRAR AQUI: TERCER ARGUMENTO PASAMOS EL FUNCTOR
priority_queue<int,vector<int>,prioridad> numero_aleatorio;
//Procesamiento
for(i = 1; i <= 100; i++)
{
//Generamos un número aleatorio del 1 al 500
Numero
= 1 + rand() % (501 - 1);
//Guardamos el número generado
numero_aleatorio.push(Numero);
}
while (!numero_aleatorio.empty())
{
cout << numero_aleatorio.top() << ", ";
numero_aleatorio.pop();
}
}
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#include <random>
#include <queue>
#include <iostream>
#include <vector>
using namespace std;
int main(){
// Generador de enteros aleatorios del 1 al 500
default_random_engine aleatorio;
uniform_int_distribution<int> entero(1, 500);
// Creamos la lambda que define la prioridad
auto prioridad= [] (const int &a, const int &b) {
return a>b;
};
// Por lo que podría llamarla así
priority_queue<int,vector<int>,decltype(prioridad)> cola(prioridad);
// También puedes declarar variables locales al bucle tal que
// (para eso no hace falta C++11)
for(int i = 0; i < 100; ++i)
cola.push(entero(aleatorio)); // Añado a la cola enteros aleatorios entre 1 y 500
while (!cola.empty())
{
cout << cola.top() << ", ";
cola.pop();
}
}