A veces es necesario tener una cola de prioridad de structs, pero lo siguiente no compila: #include struct datos { int n, m; }; int main( ) { std::priority_queue q; q.push(datos{5, 7}); // error, std::priority_queue no sabe cómo determinar la prioridad de los elementos } Aunque es posible pasarle un predicado de orden a std::priority_queue (como lo hacíamos con std::sort), hay una forma más fácil. Por omisión, std::priority_queue intenta usar el operador < para determinar si un elemento es menor que otro; entonces pone el elemento que no es menor que el resto en la cima del montículo. Podemos definir el operador < para un struct de la siguiente forma: #include #include struct datos { int n, m; }; bool operator<(const datos& a, const datos& b) { return a.n < b.n; // ordenando por n de menor a mayor, entonces en la cima del montículo estará el elemento con mayor n } int main( ) { std::priority_queue q; q.push(datos{5, 7}); q.push(datos{2, 10}); q.push(datos{9, 3}); q.push(datos{6, 5}); while (!q.empty( )) { auto actual = q.top( ); std::cout << actual.n << " " << actual.m << "\n"; q.pop( ); } } En resumen: en un montículo máximo los elementos más chicos tienden a quedar abajo; con certeza, el elemento más grande según el orden será el que quede hasta arriba.