C ++ Priority Warteschlange mit benutzerdefiniertem Komparator

C ++ Priority Warteschlange mit benutzerdefiniertem Komparator
Prioritätswarteschlangen sind in der Tat ein eindeutiger Datentyp. Sie werden von Haufen (eine Form eines Binärbaums) unterstützt, wurden jedoch ähnlich wie Warteschlangen verwendet. Was eine vorrangige Warteschlange von einer regulären Warteschlange unterscheidet, wäre, dass sie seine Sortieranordnung in O (logn) Dauer beibehalten, auch wenn neue Mitglieder hinzugefügt oder gelöscht werden. Bei rudimentären Datentypen wie Zahlen und Zeichenfolgen scheint die Verwendung einer Prioritätswarteschlange die einfachste zu sein. Prioritätswarteschlangen für maßgeschneiderte Typen sind möglich, ebenso wie die Fähigkeit, ein benutzerdefiniertes Sortiermuster für grundlegende Arten zu erstellen. Mithilfe von Prioritätswarteschlangen können Sie einen angepassten Komparator verwenden, z. B. Bestellvektoren. In C ++ wird dies normalerweise nur mit einer Struktur beendet. Lambda -Anweisungen sind jedoch schneller zu konstruieren und können Sie über den Umfang hinaus zugreifen (was komplex ist, um mit Strukturen sicherzustellen). In diesem Leitfaden werden wir also das Beispiel für das Priority -Warteschlangen mit dem Kundenvergleich erörtern.

Beispiel:

Beginnen wir mit dem Beispiel der Verwendung einer Prioritätswarteschlange mit dem benutzerdefinierten Komparator in C++. Die Terminalschale muss also mit einem kurzen Weg geöffnet werden. Die C ++ - Datei muss in der Shell unter Verwendung der Anweisung „Touch“ von Ubuntu erstellt werden. Es ist ziemlich einfach, dies zu tun. Danach muss diese Datei in einem Editor geöffnet werden, um Code zu erstellen. Sie können VIM-, Text- oder Nano -Editor haben. Wir verwenden den Redakteur „Nano“ hier, um eine schnelle Bearbeitung und Aktualisierung zu erhalten.

$ Touch Warteschlange.CC
$ nano queue.CC

Die leere C ++ - Datei wird also auf Ihrem Terminalbildschirm innerhalb des Nano -Editors geöffnet. Es ist Zeit, einige Header -Bibliotheken zu dem Start hinzuzufügen, damit unser Code ordnungsgemäß funktioniert. Daher haben wir mit jedem Header das Zeichen "#include" verwendet. Der Header „iOstream“ wird verwendet, um den Eingangs-Output-Stream zu verwenden. Der "Vektor" -Header wird abgeschaltet, um die Vektordatenstruktur zu verwenden. Der Header „Under Ordered_map“ wurde verwendet, um eine Karte für die Werte eines Vektors in Mengen zu erstellen. Die Header -Header -Datei "Warteschlangen" ist hier, um die Prioritätswarteschlange und die damit verbundenen Datenfunktionen zu verwenden. Wir haben die Main () -Methode nach der Nutzung „STD“ -Standardnamenspace gestartet. Wir haben die Main () -Methode gestartet. Wir haben eine Vektordatenstruktur mit dem Namen „Farbe“ des String -Typs erstellt, um Stringwerte zu halten. Während das Vektorobjekt „Farbe“ die Funktion push_back () verwendet hat, um einige Farbnamen im Vektor hinzuzufügen, habe ich i.e., Rot, Grün, Blau, Weiß und Schwarz.

#enthalten
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

Cout << "Starting… \n";
Vektor Farbe;
Farbe.push_back ("rot");
Farbe.push_back ("grün");
Farbe.push_back ("blau");
Farbe.push_back ("weiß");
Farbe.push_back ("schwarz");

Nachdem wir ein Vektorobjekt erstellt haben, müssen wir eine Kartenstruktur mit dem Schlüsselwort "Under Ordered_map" erstellen. Das Objekt für diese Karte lautet "m" und enthält String- und Ganzzahlparameter. Die Karte wird erstellt, um die Ganzzahlmenge an den String -Vektor zu binden, so.

Under Ordered_mapM;
m ["rot"] = 2;
m ["grün"] = 4;
m ["blau"] = 6;
m ["weiß"] = 8;
m ["schwarz"] = 10;

Hier kommt der benutzerdefinierte Komparator als variabler „CMP“ mit dem Schlüsselwort „auto.Das Auto -Keyword wird verwendet, um das Ergebnis eines beliebigen Typs zurückzugewinnen, ohne es zu definieren. Die Anweisung „If“ wird verwendet, um zu prüfen, ob die Menge eines linken Kartenwerts gleich der Menge eines rechten Kartenwerts ist oder nicht. In diesem Fall wird es zurückgegeben, dass das linke Seitungszeichen größer als das rechte Seite einer Zeichenfolge zu der Variablen „CMP“ ist. Wenn sie nicht gleich sind, wird zurückgegeben, dass der Wert der rechten Seite höher ist als der Mengenwert einer String durch eine Karte. Dies sortiert die Menge in absteigender Reihenfolge, während der String -Name in aufsteigender Reihenfolge bestellt wird.

auto cmp = [&] (String & L, String & R)
if (m [le] == m [r])
return l> r;
return m [r]> m [l];
;

Jetzt ist es Zeit, eine vorrangige Warteschlange zu erstellen und alle Farben mit dem Vektor hinzuzufügen. Die Prioritätswarteschlange wurde also mit dem String -Typ -Vektor generiert, und der Deklarationstyp wurde aus der Comp -Variablen festgelegt. Der PQ ist das vorrangige Warteschlangenobjekt. Die "für" -Schloop ist hier, um jede Farbe über die PUSP () -Funktion in die Prioritätswarteschlange "PQ" zu drücken.

Prioritätswarteschlange, DeclType (CMP)> PQ (CMP);
für (const string & clr: color)
pq.Push (CLR);

Die Schleife "Während" wird weiterhin ausgeführt, bis die Warteschlange nicht leer ist, und fügt jede Zeichenfolge in die Zeichenfolge "CLR" hinzu. Dieser besondere Wert würde aufgetaucht und auf der Schale angezeigt werden. Unser Programmcode ist hier abgeschlossen und bereit, ausgeführt zu werden.

während(!pq.leer())
Saitenfrucht = PQ.Spitze();
pq.Pop();
Cout << fruit << " " << m[fruit] << endl;

Cout << "Ending… \n";
Rückkehr 0;

Die Zusammenstellung ist ziemlich erfolgreich. Darüber hinaus wurden alle Stringwerte des Vektors zusammen mit ihren Mengen auf der Hülle angezeigt, die durch „MAP“ abgebildet werden.Sie können sehen, dass die Mengenauftrag in unserem Fall absteigt.

$ g ++ Warteschlange.CC
$ ./A.aus

Abschluss:

Hier ging es um das einfache Beispiel einer Prioritätswarteschlange mit einem benutzerdefinierten Komparator in C++. Wir haben es innerhalb eines einzigen Beispiels im Detail besprochen, indem wir einen einfachen und einfachsten Weg beibehalten haben. Wir haben den Code in Form von Brocken hinzugefügt, die den Lesern hilft, ihn gut zu verstehen.