Um die C++-Prioritätswarteschlange zu verwenden, sollte das Programm mit folgendem Code beginnen:
#einschließen#einschließen
Verwenden von Namespace-Std;
Es schließt die Warteschlangenbibliothek in das Programm ein.
Um weiterlesen zu können, sollte der Leser über Grundkenntnisse in C had verfügen++.
Artikelinhalt
- Einführung - siehe oben
- Grundkonstruktion
- Wichtige Memberfunktionen
- Andere Funktionen der Prioritätswarteschlange
- String-Daten
- Andere Konstruktionen mit Prioritätswarteschlangen
- Fazit
Grundkonstruktion
Die Datenstruktur muss erst erstellt werden, bevor sie verwendet werden kann. Konstruktion bedeutet hier, ein Objekt aus der Queue-Klasse der Bibliothek zu instanziieren. Dem Queue-Objekt muss dann vom Programmierer ein Name gegeben werden. Die einfachste Syntax zum Erstellen einer Prioritätswarteschlange ist:
PrioritätswarteschlangeBei dieser Syntax wird der größte Wert zuerst entfernt. Ein Beispiel für die Instanziierung ist:
Prioritätswarteschlangeoder
PrioritätswarteschlangeDer Vektor und die Deque sind zwei Datenstrukturen in C++. Mit beiden kann eine priority_queue erstellt werden. Die Syntax zum Erstellen einer Prioritätswarteschlange aus der Vektorstruktur lautet:
PrioritätswarteschlangeEin Beispiel für diese Instanziierung ist:
PrioritätswarteschlangeBeachten Sie die Lücke zwischen > und > am Ende der Deklaration. Dies soll Verwechslungen mit >> . vermeiden. Der Standardvergleichscode ist „weniger“
Wenn der kleinste Wert zuerst entfernt werden soll, muss die Anweisung lauten:
PrioritätswarteschlangeWichtige Memberfunktionen
Die push()-Funktion
Diese Funktion schiebt einen Wert, der ihr Argument ist, in die priority_queue. Es kehrt leer zurück. Der folgende Code veranschaulicht dies:
pq.drücken (10);
pq.drücken (30);
pq.drücken (20);
pq.drücken (50);
pq.drücken (40);
Diese priority_queue hat 5 ganzzahlige Werte in der Reihenfolge 10, 30, 20, 50, 40 . erhalten. Wenn alle diese Elemente aus der Prioritätswarteschlange entfernt werden sollen, werden sie in der Reihenfolge 50, 40, 30, 20, 10 . ausgegeben.
Die pop()-Funktion
Diese Funktion entfernt den Wert mit der höchsten Priorität aus der priority_queue. Wenn der Vergleichscode "größer" ist
pq.push('a'); pq.push('c'); pq.push('b'); pq.push('e'); pq.push('d');
Beachten Sie, dass zum Aufrufen einer Memberfunktion dem Namen des Objekts ein Punkt folgen muss und dann die Funktion.
Die top()-Funktion
Das Pop() Funktion entfernt den nächsten Wert mit der höchsten Priorität, gibt ihn aber nicht zurück, da Pop() ist eine Leerfunktion. Verwenden Sie die oben() Funktion, um den Wert mit der höchsten Priorität zu kennen, der als nächstes entfernt werden muss. Das oben() Funktion gibt eine Kopie des Wertes mit der höchsten Priorität in der priority_queue zurück. Der folgende Code, bei dem der nächste Wert mit der höchsten Priorität der niedrigste Wert ist, veranschaulicht dies
pq.push('a'); pq.push('c'); pq.push('b'); pq.push('e'); pq.push('d');
char ch1 = pq.oben(); pq.Pop();
char ch2 = pq.oben(); pq.Pop();
char ch3 = pq.oben(); pq.Pop();
char ch4 = pq.oben(); pq.Pop();
char ch5 = pq.oben(); pq.Pop();
cout<
Die empty() Funktion
Wenn ein Programmierer die oben() Funktion auf einer leeren priority_queue, nach der erfolgreichen Kompilierung würde er eine Fehlermeldung erhalten wie:
Überprüfen Sie daher immer, ob die Prioritätswarteschlange nicht leer ist, bevor Sie die oben() Funktion. Das leer() Memberfunktion gibt einen bool zurück, true, wenn die Warteschlange leer ist, und false, wenn die Warteschlange nicht leer ist. Der folgende Code veranschaulicht dies:
Prioritätswarteschlangeint i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.drücken (i1); pq.drücken (i2); pq.drücken (i3); pq.drücken (i4); pq.drücken (i5);
während(!pq.leer())
cout << pq.top() << ";
pq.Pop();
cout << '\n';
Andere Funktionen der Prioritätswarteschlange
Die size() Funktion
Diese Funktion gibt die Länge der Prioritätswarteschlange zurück, wie der folgende Code veranschaulicht:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.drücken (i1); pq.drücken (i2); pq.drücken (i3); pq.drücken (i4); pq.drücken (i5);
int len = pq.Größe();
cout << len << '\n';
Die Ausgabe ist 5.
Die swap()-Funktion
Wenn zwei priority_queues den gleichen Typ und die gleiche Größe haben, können sie mit dieser Funktion ausgetauscht werden, wie der folgende Code zeigt:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.drücken (i1); pq1.drücken (i2); pq1.drücken (i3); pq1.drücken (i4); pq1.drücken (i5);
Prioritätswarteschlange
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.drücken (it1); pqA.drücken (es2); pqA.drücken (it3); pqA.drücken (es4); pqA.drücken (es5);
pq1.tauschen (pqA);
während(!pq1.leer())
cout << pq1.top() << ";
pq1.Pop();
cout<<'\n';
während(!pqA.leer())
cout << pqA.top() << ";
pqA.Pop();
cout<<'\n';
Die Ausgabe ist:
5 4 3 2 1
50 40 30 20 10
Die emplace() Funktion
Das einlagern() Funktion ist ähnlich der Push-Funktion. Der folgende Code veranschaulicht dies:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.einlagern (i1); pq1.einlagern(i2); pq1.einlagern(i3); pq1.einlagern(i4); pq1.einlagern(i5);
während(!pq1.leer())
cout << pq1.top() << ";
pq1.Pop();
cout<<'\n';
Die Ausgabe ist:
50 40 30 20 10
String-Daten
Beim Vergleichen von Strings sollte die String-Klasse verwendet werden und nicht die direkte Verwendung der String-Literale, da diese Zeiger und nicht die tatsächlichen Strings vergleichen würden. Der folgende Code zeigt, wie die String-Klasse verwendet wird:
#einschließenPrioritätswarteschlange
string s1 = string("Stift"), s2 = string("bleistift"), s3 = string("Übungsbuch"), s4 = string("lehrbuch"), s5 = string("lineal");
pq1.drücken (s1); pq1.drücken (s2); pq1.drücken (s3); pq1.drücken (s4); pq1.drücken (s5);
während(!pq1.leer())
cout << pq1.top() << " ";
pq1.Pop();
cout<<'\n';
Die Ausgabe ist:
Lehrbuch Lineal Bleistift Stift Schulheft
Andere Konstruktionen mit Prioritätswarteschlangen
Explizite Erstellung aus einem Vektor
Eine Prioritätswarteschlange kann explizit aus einem Vektor erstellt werden, wie der folgende Code zeigt:
Vektor
Prioritätswarteschlange
während(!pq.leer())
cout << pq.top() << ";
pq.Pop();
cout<<'\n';
Die Ausgabe ist: 50 40 30 20 10. Diesmal muss auch der Vektorheader enthalten sein. Die Argumente für die Konstruktorfunktion übernehmen die Start- und Endzeiger des Vektors. Der Datentyp für den Vektor und der Datentyp für die Priority_queue müssen gleich sein.
Um den geringsten Wert zur Priorität zu machen, wäre die Deklaration für den Konstruktor:
PrioritätswarteschlangeExplizite Erstellung aus einem Array
Eine Prioritätswarteschlange kann explizit aus einem Array erstellt werden, wie der folgende Code zeigt:
Prioritätswarteschlange
während(!pq.leer())
cout << pq.top() << ";
pq.Pop();
cout<<'\n';
Die Ausgabe ist: 50 40 30 20 10. Die Argumente für die Konstruktorfunktion übernehmen die Start- und Endzeiger des Arrays. arr gibt den Startzeiger zurück, „arr+5“ gibt den Zeiger direkt hinter dem Array zurück und 5 ist die Größe des Arrays. Der Datentyp für das Array und der Datentyp für die Priority_queue müssen gleich sein.
Um den geringsten Wert zur Priorität zu machen, wäre die Deklaration für den Konstruktor:
PrioritätswarteschlangeHinweis: In C++ wird die priority_queue eigentlich als Adapter bezeichnet, nicht nur als Container.
Benutzerdefinierter Vergleichscode
Alle Werte in der Prioritätswarteschlange aufsteigend oder alle absteigend zu haben, ist nicht die einzige Option für die Prioritätswarteschlange. Eine Liste mit 11 ganzen Zahlen für einen maximalen Heap lautet beispielsweise:
88, 86, 87, 84, 82, 79,74, 80, 81, , , 64, 69
Der höchste Wert ist 88. Darauf folgen zwei Zahlen: 86 und 87, die kleiner als 88 . sind. Der Rest der Zahlen ist kleiner als diese drei Zahlen, aber nicht wirklich in Ordnung. Es gibt zwei leere Zellen in der Liste. Die Zahlen 84 und 82 sind kleiner als 86. Die Zahlen 79 und 74 sind kleiner als 87. Die Zahlen 80 und 81 sind kleiner als 84. Die Zahlen 64 und 69 sind kleiner als 79.
Die Platzierung der Zahlen folgt den Max-Heap-Kriterien - siehe später. Um ein solches Schema für die priority_queue bereitzustellen, muss der Programmierer seinen eigenen Vergleichscode bereitstellen - siehe später.
Fazit
Eine C++-Prioritätswarteschlange ist eine First-In-First-Out-Warteschlange. Die Memberfunktion, drücken(), fügt der Warteschlange einen neuen Wert hinzu. Die Memberfunktion, oben(), liest den obersten Wert in der Warteschlange. Die Memberfunktion, Pop(), entfernt, ohne den obersten Wert der Warteschlange zurückzugeben. Die Memberfunktion, leer(), prüft, ob die Warteschlange leer ist. Die Priorität_Warteschlange unterscheidet sich jedoch von der Warteschlange darin, dass sie einem Prioritätsalgorithmus folgt. Es kann am größten sein, vom ersten bis zum letzten oder am wenigsten, vom ersten bis zum letzten. Die Kriterien (Algorithmus) können auch vom Programmierer definiert werden.