Die Standard-Warteschlange mit STL-Priorität ist Max (die Funktion Top gibt das größte Element zurück).
Nehmen wir der Einfachheit halber an, dass es sich um eine Prioritätswarteschlange mit int-Werten handelt.
c++
stl
priority-queue
amitlicht
quelle
quelle
operator>
, was mit Charme funktionieren würdestd::greater
. Sie können auch Ihren eigenen Funktor schreiben, anstattstd::greater
wenn Sie möchten.operator<
;)vector
unddeque
die Anforderungen, die ein zugrunde liegender Container für eine priority_queue erfüllen muss. Sie können auch eine benutzerdefinierte Containerklasse verwenden. Eine ausführliche Erklärung finden Sie unter cplusplus.com/reference/queue/priority_queueEine Möglichkeit wäre, einen geeigneten Komparator zu definieren, mit dem die normale Prioritätswarteschlange so bearbeitet werden kann, dass ihre Priorität umgekehrt wird:
Welches würde 1, 3, 5, 8 jeweils ausgeben.
Einige Beispiele für die Verwendung von Prioritätswarteschlangen über STL- und Sedgewick-Implementierungen finden Sie hier .
quelle
Der dritte Vorlagenparameter für
priority_queue
ist der Komparator. Stellen Sie es eingreater
.z.B
Sie müssen
#include <functional>
fürstd::greater
.quelle
Sie können dies auf verschiedene Arten tun:
1. Verwenden
greater
als Vergleichsfunktion:2. Einfügen von Werten durch Ändern des Vorzeichens (mit Minus (-) für positive Zahl und Plus (+) für negative Zahl:
3. Verwenden einer benutzerdefinierten Struktur oder Klasse:
4. Mit einer benutzerdefinierten Struktur oder Klasse können Sie priority_queue in beliebiger Reihenfolge verwenden. Angenommen, wir möchten die Menschen in absteigender Reihenfolge nach ihrem Gehalt und, wenn sie gebunden sind, nach ihrem Alter sortieren.
Das gleiche Ergebnis kann durch Überlastung des Bedieners erzielt werden:
In der Hauptfunktion:
quelle
bool operator > (const people & p)const
in 5) Operatorüberladung<
Überladung gesehen , es ist besser zu überladen>
und zu benutzengreater<people>
In C ++ 11 können Sie der Einfachheit halber auch einen Alias erstellen:
Und benutze es so:
quelle
Eine Möglichkeit, dieses Problem zu lösen, besteht darin, das Negativ jedes Elements in der priority_queue zu verschieben, damit das größte Element zum kleinsten Element wird. Nehmen Sie zum Zeitpunkt der Pop-Operation die Negation jedes Elements.
quelle
Basierend auf vor allem Antworten habe ich einen Beispielcode zum Erstellen einer Prioritätswarteschlange erstellt. Hinweis: Es funktioniert mit C ++ 11 und höheren Compilern
Ausgabe des obigen Codes
quelle
Wir können dies auf verschiedene Arten tun.
Verwenden des Vorlagenkomparatorparameters
Verwenden der verwendeten definierten Compartor-Klasse
quelle