Om de C++ priority_queue te gebruiken, zou het programma moeten beginnen met code zoals:
#include#include
namespace std; gebruiken;
Het bevat de wachtrijbibliotheek in het programma.
Om verder te kunnen lezen, moet de lezer een basiskennis van C . hebben gehad++.
Artikel Inhoud
- Inleiding - zie hierboven
- Basisconstructie
- Belangrijke ledenfuncties
- Andere prioriteitswachtrijfuncties
- Tekenreeksgegevens
- Andere prioriteitswachtrijconstructies
- Conclusie
Basisconstructie
De datastructuur moet eerst worden geconstrueerd voordat deze kan worden gebruikt. Constructie betekent hier het instantiëren van een object uit de wachtrijklasse van de bibliotheek. Het wachtrij-object moet dan een naam hebben die de programmeur eraan heeft gegeven. De eenvoudigste syntaxis om een prioriteitswachtrij te maken is:
prioriteits-rijMet deze syntaxis wordt de grootste waarde het eerst verwijderd. Een voorbeeld van de instantie is:
prioriteits-rijof
prioriteits-rijDe vector en de deque zijn twee datastructuren in C++. Met beide kan een priority_queue worden gemaakt. De syntaxis om een prioriteitswachtrij te maken op basis van de vectorstructuur is:
prioriteits-rijEen voorbeeld van deze instantie is:
prioriteits-rijLet op de opening tussen > en > aan het einde van de aangifte. Dit om verwarring met >> . te voorkomen. De standaard vergelijkingscode is "minder"
Als de minste waarde eerst moet worden verwijderd, moet de instructie zijn:
prioriteits-rijBelangrijke ledenfuncties
De push()-functie
Deze functie duwt een waarde, die het argument is, in de prioriteit_wachtrij. Het keert leeg terug. De volgende code illustreert dit:
pq.duwen(10);
pq.duwen (30);
pq.duwen(20);
pq.duwen(50);
pq.duwen(40);
Deze prioriteit_wachtrij heeft 5 gehele waarden ontvangen in de volgorde 10, 30, 20, 50, 40. Als al deze elementen uit de prioriteitswachtrij moeten worden gehaald, zullen ze verschijnen in de volgorde 50, 40, 30, 20, 10.
De pop()-functie
Deze functie verwijdert uit de priority_queue de waarde met de hoogste prioriteit. Als de vergelijkingscode "groter" is
pq.duwen('een'); pq.duwen('c'); pq.duwen('b'); pq.duwen('e'); pq.duwen('d');
Merk op dat om een lidfunctie aan te roepen, de naam van het object gevolgd moet worden door een punt, en dan de functie.
De top() Functie
De knal() functie verwijdert de volgende waarde met de hoogste prioriteit, maar geeft deze niet terug, zoals knal() is een ongeldige functie. Gebruik de top() functie om de waarde met de hoogste prioriteit te kennen die vervolgens moet worden verwijderd. De top() functie retourneert een kopie van de waarde met de hoogste prioriteit in de prioriteit_wachtrij. De volgende code, waarbij de volgende waarde met de hoogste prioriteit de minste waarde is, illustreert dit:
pq.duwen('een'); pq.duwen('c'); pq.duwen('b'); pq.duwen('e'); pq.duwen('d');
char ch1 = pq.top(); pq.knal();
char ch2 = pq.top(); pq.knal();
char ch3 = pq.top(); pq.knal();
char ch4 = pq.top(); pq.knal();
char ch5 = pq.top(); pq.knal();
cout<
De lege() functie
Als een programmeur de top() functie op een lege prioriteit_wachtrij, na de succesvolle compilatie, zou hij een foutmelding ontvangen zoals:
Controleer dus altijd of de prioriteitswachtrij niet leeg is voordat u de top() functie. De leeg() member functie retourneert een bool, true, als de wachtrij leeg is, en false als de wachtrij niet leeg is. De volgende code illustreert dit:
prioriteits-rijint i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.duwen (i1); pq.duwen (i2); pq.duwen (i3); pq.duwen (i4); pq.duwen(i5);
terwijl(!pq.leeg())
cout << pq.top() << ";
pq.knal();
cout << '\n';
Andere prioriteitswachtrijfuncties
De maat () Functie:
Deze functie retourneert de lengte van de prioriteitswachtrij, zoals de volgende code illustreert:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.duwen (i1); pq.duwen (i2); pq.duwen (i3); pq.duwen (i4); pq.duwen(i5);
int len = pq.grootte();
cout << len << '\n';
De uitvoer is 5.
De swap()-functie
Als twee prioriteitswachtrijen van hetzelfde type en dezelfde grootte zijn, kunnen ze door deze functie worden verwisseld, zoals de volgende code laat zien:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.duwen (i1); pq1.duwen (i2); pq1.duwen (i3); pq1.duwen (i4); pq1.duwen(i5);
prioriteits-rij
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.duwen(it1); pqA.duwen (it2); pqA.duwen(it3); pqA.duwen (it4); pqA.duwen(it5);
pq1.omwisselen (pqA);
terwijl(!pq1.leeg())
cout << pq1.top() << ";
pq1.knal();
schat<<'\n';
terwijl(!pqA.leeg())
cout << pqA.top() << ";
pqA.knal();
schat<<'\n';
De uitvoer is:
5 4 3 2 1
50 40 30 20 10
De emplace()-functie
De plaats() functie is vergelijkbaar met de push-functie. De volgende code illustreert dit:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.plaats(i1); pq1.plaats(i2); pq1.plaats(i3); pq1.plaats(i4); pq1.plaats(i5);
terwijl(!pq1.leeg())
cout << pq1.top() << ";
pq1.knal();
schat<<'\n';
De uitvoer is:
50 40 30 20 10
Tekenreeksgegevens
Bij het vergelijken van tekenreeksen moet de tekenreeksklasse worden gebruikt en niet het directe gebruik van de letterlijke tekenreeksen, omdat het pointers zou vergelijken en niet de daadwerkelijke tekenreeksen. De volgende code laat zien hoe de tekenreeksklasse wordt gebruikt:
#includeprioriteits-rij
string s1 = string ("pen"), s2 = string ("potlood"), s3 = string ("oefenboek"), s4 = string ("tekstboek"), s5 = string ("liniaal");
pq1.duw(s1); pq1.duw(s2); pq1.duw(s3); pq1.duw(s4); pq1.duw(s5);
terwijl(!pq1.leeg())
cout << pq1.top() << " ";
pq1.knal();
schat<<'\n';
De uitvoer is:
tekstboek heerser potlood pen werkboek
Andere prioriteitswachtrijconstructies
Expliciete creatie van een vector
Een prioriteitswachtrij kan expliciet worden gemaakt op basis van een vector, zoals de volgende code laat zien:
vector
prioriteits-rij
terwijl(!pq.leeg())
cout << pq.top() << ";
pq.knal();
schat<<'\n';
De output is: 50 40 30 20 10. Deze keer moet ook de vectorkop worden opgenomen. De argumenten voor de constructorfunctie nemen de begin- en eindwijzers van de vector. Het gegevenstype voor de vector en het gegevenstype voor de prioriteit_wachtrij moeten hetzelfde zijn.
Om de minste waarde de prioriteit te geven, zou de verklaring voor de constructor zijn:
prioriteits-rijExpliciete creatie vanuit een array
Een prioriteitswachtrij kan expliciet worden gemaakt op basis van een array, zoals de volgende code laat zien:
prioriteits-rij
terwijl(!pq.leeg())
cout << pq.top() << ";
pq.knal();
schat<<'\n';
De output is: 50 40 30 20 10. De argumenten voor de constructorfunctie nemen de begin- en eindaanwijzers van de array. arr retourneert de startaanwijzer, "arr+5" retourneert de aanwijzer net voorbij de array, en 5 is de grootte van de array. Het datatype voor de array en het datatype voor de priority_queue moeten hetzelfde zijn.
Om de minste waarde de prioriteit te geven, zou de verklaring voor de constructor zijn:
prioriteits-rijOpmerking: in C++ wordt de prioriteit_wachtrij eigenlijk een adapter genoemd, niet alleen een container.
Aangepaste vergelijkingscode
Alle waarden in de prioriteitswachtrij oplopend of allemaal aflopend hebben is niet de enige optie voor de prioriteitswachtrij. Een lijst met 11 gehele getallen voor een maximale heap is bijvoorbeeld:
88, 86, 87, 84, 82, 79,74, 80, 81, , , 64, 69
De hoogste waarde is 88. Dit wordt gevolgd door twee getallen: 86 en 87, die kleiner zijn dan 88. De rest van de nummers zijn minder dan deze drie nummers, maar niet echt in orde. Er zijn twee lege cellen in de lijst. De nummers 84 en 82 zijn kleiner dan 86. De nummers 79 en 74 zijn kleiner dan 87. De getallen 80 en 81 zijn kleiner dan 84. De getallen 64 en 69 zijn kleiner dan 79.
De plaatsing van de nummers volgt de max-heap criteria - zie later. Om een dergelijk schema voor de prioriteit_wachtrij te bieden, moet de programmeur zijn eigen vergelijkingscode opgeven - zie later.
Conclusie
Een C++ priority_queue is een first-in-first-out wachtrij. De ledenfunctie, Duwen(), voegt een nieuwe waarde toe aan de wachtrij. De ledenfunctie, top(), leest de hoogste waarde in de wachtrij. De ledenfunctie, knal(), verwijdert zonder de hoogste waarde van de wachtrij terug te geven. De ledenfunctie, leeg(), controleert of de wachtrij leeg is. De prioriteit_wachtrij verschilt echter van de wachtrij, in die zin dat het een prioriteitsalgoritme volgt. Het kan het grootst zijn, van de eerste tot de laatste, of de minste, van de eerste tot de laatste. De criteria (algoritme) kunnen ook door de programmeur worden gedefinieerd.