C++

So verwenden Sie C++ Priority_queue?

So verwenden Sie C++ Priority_queue?
In C++ ist eine Warteschlange eine Listendatenstruktur, bei der das erste Element, das in die Liste eingefügt wird, das erste Element ist, das entfernt wird, wenn das Entfernen erfolgen soll. Eine Prioritätswarteschlange in C++ ist ähnlich, hat aber eine gewisse Ordnung; es ist das Element mit dem größten Wert, das zuerst entfernt wird. Die Prioritätswarteschlange kann weiterhin so konfiguriert werden, dass das Element mit dem geringsten Wert zuerst entfernt wird. Jede Warteschlange muss mindestens die drücken() Funktion und die Pop() Funktion. Das drücken() Funktion fügt hinten ein neues Element hinzu. Für die normale Warteschlange ist die Pop() Funktion entfernt das erste Element, das jemals eingefügt wurde. Für die Prioritätswarteschlange ist die Pop() Funktion entfernt das Element mit der höchsten Priorität, das je nach Bestellschema das größte oder kleinste sein kann.

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ätswarteschlange Warteschlangenname;

Bei dieser Syntax wird der größte Wert zuerst entfernt. Ein Beispiel für die Instanziierung ist:

Prioritätswarteschlange pq;

oder

Prioritätswarteschlange pq;

Der 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ätswarteschlange, vergleichen> pq;

Ein Beispiel für diese Instanziierung ist:

Prioritätswarteschlange, Weniger > pq;

Beachten Sie die Lücke zwischen > und > am Ende der Deklaration. Dies soll Verwechslungen mit >> . vermeiden. Der Standardvergleichscode ist „weniger““, was bedeutet, dass der größte und nicht unbedingt der erste Wert zuerst entfernt wird. Die Erstellungsanweisung kann also einfach wie folgt geschrieben werden:

Prioritätswarteschlange > pq;

Wenn der kleinste Wert zuerst entfernt werden soll, muss die Anweisung lauten:

Prioritätswarteschlange, größer > pq;

Wichtige 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:

Prioritätswarteschlange pq;
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“, dann wird das Element mit dem kleinsten Wert entfernt. Wenn es erneut aufgerufen wird, entfernt es das nächste Element mit dem kleinsten Wert des Rests; erneut aufgerufen, entfernt es den nächstkleineren vorhandenen Wert und so weiter. Es kehrt leer zurück. Der folgende Code veranschaulicht dies:

Prioritätswarteschlange, größer > pq;
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

Prioritätswarteschlange, größer > pq;
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 Ausgabe ist 'a"b"c"d"e'.

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:

Segmentierungsfehler (Core-Dump)

Ü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ätswarteschlange pq;
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);
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:

Prioritätswarteschlange pq;
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:

Prioritätswarteschlange pq1;
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 pqA;
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:

Prioritätswarteschlange pq1;
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ßen
Prioritätswarteschlange pq1;
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:

#einschließen
Vektor vtr = 10, 30, 20, 50, 40;
Prioritätswarteschlange pq(vtr.begin(), vtr.Ende());
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ätswarteschlange, größer>int> > pq(vtr.begin(), vtr.Ende());

Explizite Erstellung aus einem Array
Eine Prioritätswarteschlange kann explizit aus einem Array erstellt werden, wie der folgende Code zeigt:

int arr[] = 10, 30, 20, 50, 40;
Prioritätswarteschlange pq(an, an+5);
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ätswarteschlange, größer > pq(an, an+5);

Hinweis: 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.

Steuern und verwalten Sie Mausbewegungen zwischen mehreren Monitoren in Windows 10
Dual-Display-Maus-Manager lässt Sie die Mausbewegung zwischen mehreren Monitoren steuern und konfigurieren, indem Sie ihre Bewegungen in der Nähe der ...
Mit WinMouse können Sie die Mauszeigerbewegung auf einem Windows-PC anpassen und verbessern improve
Wenn Sie die Standardfunktionen Ihres Mauszeigers verbessern möchten, verwenden Sie Freeware WinMouse. Es fügt weitere Funktionen hinzu, damit Sie das...
Linker Mausklick funktioniert nicht unter Windows 10
Wenn Sie eine dedizierte Maus mit Ihrem Laptop oder Desktop-Computer verwenden, aber die linker Mausklick funktioniert nicht unter Windows 10/8/7 aus ...