Jak używać C ++ Priority_queue?

Jak używać C ++ Priority_queue?
W C ++ kolejka to struktura danych listy, w której pierwszym elementem umieszczonym na liście jest pierwszy element, który zostanie usunięty, gdy ma nastąpić usunięcie. Kolejka priorytetowa w C ++ jest podobna, ale ma pewne zamówienie; jest to element o największej wartości, która jest najpierw usunięta. Kolejkę priorytetową można nadal skonfigurować tak, aby był to element o najmniejszej wartości, która jest najpierw usunięta. Każda kolejka musi mieć przynajmniej naciskać() funkcja i Muzyka pop() funkcjonować. naciskać() Funkcja dodaje nowy element z tyłu. Dla normalnej kolejki, Muzyka pop() Funkcja usuwa pierwszy element, jaki kiedykolwiek wepchnął. Dla kolejki priorytetowej, Muzyka pop() Funkcja usuwa element z najwyższym priorytetem, który może być największy lub najmniejszy, w zależności od schematu zamawiania.

Aby użyć C ++ Priority_queue, program powinien zacząć od kodu takiego jak:

#włączać
#włączać
za pomocą przestrzeni nazw Std;

Obejmuje bibliotekę kolejki w programie.

Aby kontynuować czytanie, czytelnik powinien mieć podstawową wiedzę na temat C++.

Treść artykułu

  • Podstawowa konstrukcja
  • Ważne funkcje członka
  • Inne funkcje kolejki priorytetowej
  • Dane ciągów
  • Inne konstrukcje kolejki priorytetowej
  • Wniosek

Podstawowa konstrukcja

Struktura danych musi zostać najpierw skonstruowana, zanim będzie można je wykorzystać. Konstrukcja tutaj oznacza instancję obiektu z klasy w kolejce biblioteki. Obiekt kolejki musi następnie mieć nazwę podaną przez programistę. Najprostsza składnia do utworzenia kolejki priorytetowej jest:

kolejka priorytetowa Queuename;

Dzięki tej składni największa wartość jest najpierw usuwana. Przykładem instancji jest:

kolejka priorytetowa PQ;

Lub

kolejka priorytetowa PQ;

Wektor i deque to dwie struktury danych w c++. Za pomocą jednego z nich można utworzyć priorytet. Składnia do utworzenia kolejki priorytetowej ze struktury wektora jest:

kolejka priorytetowa, Porównaj> PQ;

Przykładem tej instancji jest:

kolejka priorytetowa, mniej > PQ;

Zwróć uwagę na lukę między> a> na końcu deklaracji. Ma to zapobiegać zamieszaniu z >>. Domyślny kod porównawczego jest „mniej”, co oznacza największą i niekoniecznie pierwszą wartość, zostanie najpierw usunięta. Tak więc oświadczenie o stworzeniu można po prostu napisać jako:

kolejka priorytetowa > PQ;

Jeśli najpierw należy usunąć najmniejszą wartość, instrukcja musi być:

kolejka priorytetowa, większy > PQ;

Ważne funkcje członka

Funkcja push ()
Ta funkcja przesuwa wartość, która jest jej argumentem, do priorytetu_queue. Zwraca pustkę. Poniższy kod to ilustruje:

kolejka priorytetowa PQ;
PQ.push (10);
PQ.push (30);
PQ.push (20);
PQ.push (50);
PQ.push (40);

Ten priorytetowy_queue otrzymał 5 wartości liczb całkowitych w rzędu 10, 30, 20, 50, 40. Jeśli wszystkie te elementy mają zostać wyskoczone z kolejki priorytetowej, wyjdą one w kolejności 50, 40, 30, 20, 10.

Funkcja pop ()
Ta funkcja usuwa z priorytetu_queue wartości z najwyższym priorytetem. Jeśli kod porównywania jest „większy”, usunie element o najmniejszej wartości. Jeśli wywołuje ponownie, usuwa następny element z najmniejszą wartością reszty; Zwołany ponownie, usuwa następną najmniejszą obecną wartość i tak dalej. Zwraca pustkę. Poniższy kod to ilustruje:

kolejka priorytetowa, większy > PQ;
PQ.push („a”);
PQ.push („c”);
PQ.push („b”);
PQ.push („e”);
PQ.push („d”);

Zauważ, że aby wywołać funkcję członka, nazwa obiektu musi następować kropka, a następnie funkcja.

Funkcja top ()
Muzyka pop() funkcja usuwa kolejną wartość najwyższego priorytetu, ale jej nie zwraca, jak Muzyka pop() jest funkcją pustki. Użyj szczyt() funkcja, aby poznać wartość najwyższego priorytetu, którą należy usunąć w następnej kolejności. szczyt() Funkcja zwraca kopię wartości najwyższego priorytetu w priorytecie_queue. Poniższy kod, w którym kolejna wartość najwyższego priorytetu jest najmniejszą wartością, ilustruje to

kolejka priorytetowa, większy > PQ;
PQ.push („a”); PQ.push („c”); PQ.push („b”); PQ.push („e”); PQ.push („d”);
char cH1 = pq.szczyt(); PQ.Muzyka pop();
char cH2 = pq.szczyt(); PQ.Muzyka pop();
char cH3 = pq.szczyt(); PQ.Muzyka pop();
Char CH4 = PQ.szczyt(); PQ.Muzyka pop();
Char CH5 = PQ.szczyt(); PQ.Muzyka pop();
Cout<

Wyjście to „A„ B ”C” D „E”.

Funkcja pustej ()
Jeśli programista używa szczyt() Funkcja na pustym priorytecie_queue, po udanej kompilacji, otrzyma komunikat o błędzie, taki jak:

Wadę segmentacji (zrzucone rdzeń)

Zawsze zawsze sprawdź, czy kolejka priorytetowa nie jest pusta przed użyciem szczyt() funkcjonować. pusty() Funkcja członka zwraca bool, prawda, jeśli kolejka jest pusta i fałsz, jeśli kolejka nie jest pusta. Poniższy kod to ilustruje:

kolejka priorytetowa PQ;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
PQ.push (i1); PQ.push (i2); PQ.push (i3); PQ.push (i4); PQ.push (i5);
chwila(!PQ.pusty())

Cout << pq.top() << ";
PQ.Muzyka pop();

Cout << '\n';

Inne funkcje kolejki priorytetowej

Funkcja rozmiaru ()
Ta funkcja zwraca długość kolejki priorytetowej, jak ilustruje następujący kod:

kolejka priorytetowa PQ;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
PQ.push (i1); PQ.push (i2); PQ.push (i3); PQ.push (i4); PQ.push (i5);
int len ​​= pq.rozmiar();
Cout << len << '\n';

Wyjście to 5.

Funkcja swap ()
Jeśli dwa priorytety są tego samego typu i rozmiaru, mogą zostać zamienione na tę funkcję, jak pokazuje następujący kod:

kolejka priorytetowa PQ1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
PQ1.push (i1); PQ1.push (i2); PQ1.push (i3); PQ1.push (i4); PQ1.push (i5);
kolejka priorytetowa PQA;
int it1 = 1; int It2 = 3; int It3 = 2; int It4 = 5; int It5 = 4;
PQA.push (it1); PQA.push (it2); PQA.push (it3); PQA.push (it4); PQA.push (it5);
PQ1.swap (PQA);
chwila(!PQ1.pusty())

Cout << pq1.top() << ";
PQ1.Muzyka pop();
cout<<'\n';
chwila(!PQA.pusty())

Cout << pqA.top() << ";
PQA.Muzyka pop();
cout<<'\n';

Wyjście to:

5 4 3 2 1
50 40 30 20 10

Fuction emplace ()
emplace () Funkcja jest podobna do funkcji push. Poniższy kod to ilustruje:

kolejka priorytetowa PQ1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
PQ1.emplace (i1);
PQ1.emplace (i2);
PQ1.emplace (i3);
PQ1.emplace (i4);
PQ1.emplace (i5);
chwila(!PQ1.pusty())

Cout << pq1.top() << ";
PQ1.Muzyka pop();
cout<<'\n';

Wyjście to:

50 40 30 20 10

Dane ciągów

Podczas porównywania ciągów należy użyć klasy ciągów, a nie bezpośredniego użycia literałów smyczkowych, ponieważ porównywałaby wskaźniki, a nie rzeczywiste ciągi. Poniższy kod pokazuje, w jaki sposób używana jest klasa ciągów:

#włączać
kolejka priorytetowa PQ1;
String S1 = String („Pen”),
S2 = String („Pencil”),
S3 = String („Książka ćwiczeń”),
S4 = String („Podręcznik”),
s5 = string („linijka”);
PQ1.push (s1);
PQ1.push (s2);
PQ1.push (s3);
PQ1.push (s4);
PQ1.push (s5);
chwila(!PQ1.pusty())

Cout << pq1.top() << " ";
PQ1.Muzyka pop();
cout<<'\n';

Wyjście to:

książka władca ołówka z podręcznika

Inne konstrukcje kolejki priorytetowej

Wyraźne tworzenie wektora
Kolejkę priorytetową można wytworzyć jawnie z wektora, jak pokazuje następujący kod:

#włączać
wektor vtr = 10, 30, 20, 50, 40;
kolejka priorytetowa PQ (VTR.początek (), vtr.koniec());
chwila(!PQ.pusty())

Cout << pq.top() << ";
PQ.Muzyka pop();
cout<<'\n';

Wyjście to: 50 40 30 20 10. Tym razem należy również uwzględnić nagłówek wektorowy. Argumenty dotyczące funkcji konstruktora podejmują wskaźniki początkowe i końcowe wektora. Typ danych dla wektora i typ danych dla priorytet_queue musi być taki sam.

Aby uzyskać najmniejszą wartość priorytetu, deklaracja dla konstruktora byłoby:

kolejka priorytetowa, Większy> int >> PQ (VTR.początek (), vtr.koniec());

Wyraźne stworzenie z tablicy
Kolejkę priorytetową można wytworzyć jawnie z tablicy, jak pokazuje następujący kod:

int arr [] = 10, 30, 20, 50, 40;
kolejka priorytetowa PQ (ARR, ARR+5);
chwila(!PQ.pusty())

Cout << pq.top() << ";
PQ.Muzyka pop();
cout<<'\n';

Wyjście to: 50 40 30 20 10. Argumenty dla funkcji konstruktora podejmują wskaźniki początkowe i końcowe tablicy. ARR zwraca wskaźnik startowy, „ARR+5” zwraca wskaźnik tuż obok tablicy, a 5 to rozmiar tablicy. Typ danych dla tablicy i typ danych dla priorytet_queue musi być taki sam.

Aby uzyskać najmniejszą wartość priorytetu, deklaracja dla konstruktora byłoby:

kolejka priorytetowa, większy > PQ (ARR, ARR+5);

Uwaga: W C ++ priorytet_queue nazywa się adapterem, a nie tylko pojemnikiem.

Niestandardowy kod porównaj

Posiadanie wszystkich wartości w kolejce priorytetowej rosnące lub wszystkie zejście nie jest jedyną opcją dla kolejki priorytetowej. Na przykład lista 11 liczb całkowitych dla maksymalnej sterty to:

88, 86, 87, 84, 82, 79,74, 80, 81 ,, 64, 69

Najwyższa wartość to 88. Następnie następują dwie liczby: 86 i 87, które są mniejsze niż 88. Reszta liczb jest mniejsza niż te trzy liczby, ale nie tak naprawdę w porządku. Na liście znajdują się dwie puste komórki. Liczby 84 i 82 są mniejsze niż 86. Liczby 79 i 74 są mniejsze niż 87. Liczby 80 i 81 są mniejsze niż 84. Liczby 64 i 69 są mniejsze niż 79.

Umieszczenie liczb podąża za kryteriami maksymalnie - patrz później. Aby zapewnić taki schemat dla priorytetu_queue, programista musi podać swój własny kod porównawczy - patrz później.

Wniosek

C ++ prioryrites_queue to pierwsza kolejna kolejka. Funkcja członka, naciskać(), dodaje nową wartość do kolejki. Funkcja członka, szczyt(), odczytuje najwyższą wartość w kolejce. Funkcja członka, Muzyka pop(), usuwa bez zwracania najwyższej wartości kolejki. Funkcja członka, pusty(), Sprawdź, czy kolejka jest pusta. Jednak priorytetowy_queue różni się od kolejki, ponieważ jest zgodny z pewnym algorytmem priorytetu. Może być największy, od pierwszego do ostatniego, a najmniej od pierwszego do ostatniego. Kryteria (algorytm) można również zdefiniować programista.