std:: priority_queue
|
Definiert im Header
<queue>
|
||
|
template
<
class
T,
|
||
Die Prioritätswarteschlange ist ein Container-Adapter , der einen konstanten Zugriff auf das größte (standardmäßig) Element bietet, auf Kosten von logarithmischer Einfügung und Entnahme.
Ein benutzerdefiniertes
Compare
kann bereitgestellt werden, um die Sortierreihenfolge zu ändern, z.B. würde die Verwendung von
std::
greater
<
T
>
dazu führen, dass das kleinste Element als
top()
erscheint.
Die Arbeit mit einer
priority_queue
ähnelt der Verwaltung eines
Heaps
in einem Container mit wahlfreiem Zugriff, mit dem Vorteil, dass der Heap nicht versehentlich ungültig gemacht werden kann.
Alle Memberfunktionen von
std::priority_queue
sind
constexpr
: Es ist möglich,
std::priority_queue
-Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.
Allerdings können
|
(since C++26) |
Inhaltsverzeichnis |
Template-Parameter
| T | - |
Der Typ der gespeicherten Elemente. Das Programm ist fehlerhaft, wenn
T
nicht derselbe Typ wie
Container::value_type
ist.
|
| Container | - |
Der Typ des zugrundeliegenden Containers, der zur Speicherung der Elemente verwendet wird. Der Container muss die Anforderungen von
SequenceContainer
erfüllen, und seine Iteratoren müssen die Anforderungen von
LegacyRandomAccessIterator
erfüllen. Zusätzlich muss er die folgenden Funktionen mit den
üblichen Semantiken
bereitstellen:
Die Standardcontainer
std::vector
(ohne
|
| Compare | - |
Ein
Compare
-Typ, der eine strikte schwache Ordnung bereitstellt.
Beachten Sie, dass der Compare -Parameter so definiert ist, dass er true zurückgibt, wenn sein erstes Argument in einer schwachen Ordnung vor seinem zweiten Argument kommt. Da die Prioritätswarteschlange jedoch die größten Elemente zuerst ausgibt, werden die Elemente, die "zuerst kommen", tatsächlich zuletzt ausgegeben. Das bedeutet, dass der Anfang der Warteschlange das "letzte" Element gemäß der durch Compare auferlegten schwachen Ordnung enthält. |
Mitgliedertypen
| Mitgliedstyp | Definition |
container_type
|
Container
|
value_compare
|
Compare
|
value_type
|
Container::value_type
|
size_type
|
Container :: size_type |
reference
|
Container::reference
|
const_reference
|
Container::const_reference
|
Member-Objekte
| Member name | Definition |
|
Container
c
|
der zugrundeliegende Container
(geschütztes Mitgliedsobjekt) |
|
Compare
comp
|
das Vergleichsfunktionsobjekt
(geschütztes Mitgliedsobjekt) |
Memberfunktionen
konstruiert die
priority_queue
(öffentliche Elementfunktion) |
|
zerstört die
priority_queue
(öffentliche Elementfunktion) |
|
|
weist Werte dem Container-Adapter zu
(öffentliche Elementfunktion) |
|
Elementzugriff |
|
|
greift auf das oberste Element zu
(öffentliche Elementfunktion) |
|
Kapazität |
|
|
prüft, ob der Container-Adapter leer ist
(öffentliche Elementfunktion) |
|
|
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion) |
|
Modifikatoren |
|
|
fügt Element ein und sortiert den zugrundeliegenden Container
(öffentliche Elementfunktion) |
|
|
(C++23)
|
fügt einen Bereich von Elementen ein und sortiert den zugrundeliegenden Container
(öffentliche Elementfunktion) |
|
(C++11)
|
konstruiert Element direkt und sortiert den zugrundeliegenden Container
(öffentliche Elementfunktion) |
|
entfernt das oberste Element
(öffentliche Elementfunktion) |
|
|
(C++11)
|
tauscht die Inhalte aus
(öffentliche Elementfunktion) |
Nicht-Member-Funktionen
|
(C++11)
|
spezialisiert den
std::swap
Algorithmus
(Funktions-Template) |
Hilfsklassen
|
spezialisiert das
std::uses_allocator
Type-Trait
(Klassen-Template-Spezialisierung) |
|
Formatierungsunterstützung für
std::priority_queue
(Klassen-Template-Spezialisierung) |
Ableitungsleitfäden |
(seit C++17) |
Hinweise
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Ranges-bewusste Konstruktion und Einfügung für Container |
__cpp_lib_constexpr_queue
|
202502L
|
(C++26) |
constexpr
std::priority_queue
|
Beispiel
#include <functional> #include <iostream> #include <queue> #include <string_view> #include <vector> template<typename T> void pop_println(std::string_view rem, T& pq) { std::cout << rem << ": "; for (; !pq.empty(); pq.pop()) std::cout << pq.top() << ' '; std::cout << '\n'; } template<typename T> void println(std::string_view rem, const T& v) { std::cout << rem << ": "; for (const auto& e : v) std::cout << e << ' '; std::cout << '\n'; } int main() { const auto data = {1, 8, 5, 6, 3, 4, 0, 9, 7, 2}; println("data", data); std::priority_queue<int> max_priority_queue; // Prioritätswarteschlange füllen for (int n : data) max_priority_queue.push(n); pop_println("max_priority_queue", max_priority_queue); // std::greater<int> lässt die Max-Prioritätswarteschlange als Min-Prioritätswarteschlange agieren std::priority_queue<int, std::vector<int>, std::greater<int>> min_priority_queue1(data.begin(), data.end()); pop_println("min_priority_queue1", min_priority_queue1); // Zweite Möglichkeit, eine Min-Prioritätswarteschlange zu definieren std::priority_queue min_priority_queue2(data.begin(), data.end(), std::greater<int>()); pop_println("min_priority_queue2", min_priority_queue2); // Verwendung eines benutzerdefinierten Funktionsobjekts zum Vergleichen von Elementen struct { bool operator()(const int l, const int r) const { return l > r; } } customLess; std::priority_queue custom_priority_queue(data.begin(), data.end(), customLess); pop_println("custom_priority_queue", custom_priority_queue); // Verwendung einer Lambda-Funktion zum Vergleichen von Elementen auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1); }; std::priority_queue<int, std::vector<int>, decltype(cmp)> lambda_priority_queue(cmp); for (int n : data) lambda_priority_queue.push(n); pop_println("lambda_priority_queue", lambda_priority_queue); }
Ausgabe:
data: 1 8 5 6 3 4 0 9 7 2 max_priority_queue: 9 8 7 6 5 4 3 2 1 0 min_priority_queue1: 0 1 2 3 4 5 6 7 8 9 min_priority_queue2: 0 1 2 3 4 5 6 7 8 9 custom_priority_queue: 0 1 2 3 4 5 6 7 8 9 lambda_priority_queue: 8 9 6 7 4 5 2 3 0 1
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 307 | C++98 |
Container
konnte nicht
std::vector<bool>
sein
|
erlaubt |
| LWG 2566 | C++98 |
Fehlende Anforderung für
Container::value_type
|
fehlerhaft, wenn
T
nicht dem selben Typ wie
Container::value_type
entspricht
|
| LWG 2684 | C++98 |
priority_queue
verwendet einen Vergleich
aber hatte keinen Member-Typedef dafür |
hinzugefügt |
Siehe auch
|
veränderbares zusammenhängendes Array
(Klassentemplate) |
|
|
platzsparende dynamische Bitset
(Klassentemplate-Spezialisierung) |
|
|
doppelseitige Warteschlange
(Klassentemplate) |