Domyślna kolejka priorytetowa stl to Max jeden (funkcja Top zwraca największy element).
Powiedzmy dla uproszczenia, że jest to kolejka priorytetowa wartości int.
c++
stl
priority-queue
amitlicht
źródło
źródło
operator>
, co działałoby jak urokstd::greater
. Możesz też napisać własny funktor zamiast,std::greater
jeśli chcesz.operator<
;)vector
ideque
spełniają wymagania, które musi spełniać podstawowy kontener dla kolejki priority_queue. Możesz również użyć niestandardowej klasy kontenera. Można znaleźć wiele skomplikowany wyjaśnienie cplusplus.com/reference/queue/priority_queueJednym ze sposobów byłoby zdefiniowanie odpowiedniego komparatora, z którym będzie można operować na zwykłej kolejce priorytetowej, tak aby jej priorytet został odwrócony:
Który wyświetli odpowiednio 1, 3, 5, 8.
Niektóre przykłady z użyciem kolejek priorytetowych poprzez STL i implementacje Sedgewick za podane są tutaj .
źródło
Trzecim parametrem szablonu dla
priority_queue
jest komparator. Ustaw go do użyciagreater
.na przykład
Musisz
#include <functional>
zastd::greater
.źródło
Możesz to zrobić na wiele sposobów:
1. Używając
greater
funkcji porównawczej:2. Wstawianie wartości poprzez zmianę ich znaku (przy użyciu znaku minus (-) dla liczby dodatniej i znaku plus (+) dla liczby ujemnej:
3. Korzystanie z niestandardowej struktury lub klasy:
4. Używając niestandardowej struktury lub klasy, możesz użyć Priority_queue w dowolnej kolejności. Załóżmy, że chcemy posortować ludzi w porządku malejącym według ich wynagrodzenia, a jeśli remis, to według ich wieku.
Ten sam wynik można uzyskać przez przeciążenie operatora:
W głównej funkcji:
źródło
bool operator > (const people & p)const
5) przeciążenia operatora<
takiego przeciążenia, lepiej jest przeciążać>
i używaćgreater<people>
W C ++ 11 możesz również dla wygody utworzyć alias:
I użyj tego w ten sposób:
źródło
Jednym ze sposobów rozwiązania tego problemu jest przesunięcie wartości ujemnej każdego elementu w Priority_queue, aby największy element stał się najmniejszym. W momencie wykonywania operacji pop, weź negację każdego elementu.
źródło
W oparciu o powyższe odpowiedzi stworzyłem przykładowy kod tworzenia kolejki priorytetowej. Uwaga: działa kompilatorami C ++ 11 i nowszymi
Wyjście powyższego kodu
źródło
Możemy to zrobić na kilka sposobów.
Korzystanie z parametru komparatora szablonów
Używanie użytej zdefiniowanej klasy compartor
źródło