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
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 priorytetowaQueuename;
Dzięki tej składni największa wartość jest najpierw usuwana. Przykładem instancji jest:
kolejka priorytetowaPQ;
Lub
kolejka priorytetowaPQ;
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 priorytetowaPQ;
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 priorytetowaPQ;
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 priorytetowaPQ;
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 priorytetowaPQ1;
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 priorytetowaPQA;
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 10Fuction emplace ()
emplace () Funkcja jest podobna do funkcji push. Poniższy kod to ilustruje:kolejka priorytetowaPQ1;
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 10Dane 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 priorytetowaPQ1;
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ęcznikaInne konstrukcje kolejki priorytetowej
Wyraźne tworzenie wektora
Kolejkę priorytetową można wytworzyć jawnie z wektora, jak pokazuje następujący kod:#włączać
wektorvtr = 10, 30, 20, 50, 40;
kolejka priorytetowaPQ (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 priorytetowaPQ (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, 69Najwyż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.