Namespaces
Variants

std:: priority_queue

From cppreference.net
Definiert im Header <queue>
template <

class T,
class Container = std:: vector < T > ,
class Compare = std:: less < typename Container :: value_type >

> class priority_queue ;

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 std::priority_queue -Objekte im Allgemeinen nicht constexpr sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.

(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 std::vector<bool> ) und std::deque erfüllen diese Anforderungen.

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

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)