2012-05-26 28 views
10

Estoy con ganas de hacer algo como esto:cola de prioridad de pares en orden inverso

priority_queue< pair<int, int>, vector<int>, greater<int> > Q; 

Esto funciona bien si el tipo que estoy comparando es int, es decir:

priority_queue< int, vector<int>, greater<int> > Q; 
embargo

, obviamente con pair<int, int>, no hay forma de comparar los pares en la cola con el estándar >. Me preguntaba qué debería hacer? ¿Cómo implementaría un > sobrecargado o existe otra forma de crear una cola de pares de prioridad con el pair.second más pequeño en la parte superior de la cola?

Respuesta

18

¿Has probado esto?

typedef pair<int, int> P; 
priority_queue< P, vector<P>, greater<P> > Q; 

Esto dará la orden inverso de la operator< normal para pair<int, int>, que comenzará con el más pequeño first tie-roto con menor second.

Si desea ordenar más pequeño second primero y first segundos, entonces necesitará una nueva funtor de clasificación (!):

struct Order 
{ 
    bool operator()(P const& a, P const& b) const 
    { 
     return a.second < b.second || a.second == b.second && a.first < b.first; 
    } 
} 

A continuación, utilice:

priority_queue< P, vector<P>, Order > Q; 
+0

@ stariz77: Tengo ahora :) –

+0

oops eliminó el comentario después de ver su edición. Le pregunté: "¿Hay alguna manera de especificar qué elemento de par se está comparando?". – bqui56

1

Debe crear su propia clase de dominio en lugar de usar pair<int, int> aquí, hasta donde puedo ver. Entonces puede sobrecargar > como desee.

Cuestiones relacionadas