A veces es necesario tener una cola de prioridad de structs, pero lo siguiente no compila: #include struct datos { int n; int 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 los otros en la cima del montículo. Podemos definir el operador < para un struct de la siguiente forma: #include #include struct datos { int n; int m; }; bool operator<(const datos& a, const datos& b) { return a.n < b.n; // se usa n para ordenar 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( ); } } Recuerden: 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. Por otra parte, std::priority_queue no permitirá que sus elementos sean modificados (no proporciona .begin( ) ni .end( ) además de que guarda los elementos como const). Eso significa que no podrán meterse al montículo a actualizar la prioridad de los clientes afectados por un sorteo (lo cual invalidaría la propiedad de montículo con alta probabilidad). Algunas implementaciones de montículos proporcionan funciones para modificar los elementos, pero std::priority_queue no. De todos modos, si un sorteo afecta a muchos clientes y los modifican uno por uno, será lento. Esta tarea es tal vez la más complicada del curso, pero quiero que lo intenten con la menor ayuda posible. Usar una cola de prioridad es muy fácil: todo lo demás deberá venir de su ingenio.