Hoe C++ Priority_queue te gebruiken?

How Use C Priority_queue



In C++ is een wachtrij een lijstgegevensstructuur waarbij het eerste element dat in de lijst wordt geplaatst, het eerste element is dat moet worden verwijderd, wanneer verwijdering moet plaatsvinden. Een prioriteitswachtrij in C++ is vergelijkbaar, maar heeft enige ordening; het is het element met de grootste waarde dat als eerste wordt verwijderd. De prioriteitswachtrij kan nog steeds zo worden geconfigureerd dat het het element met de minste waarde is dat als eerste wordt verwijderd. Elke wachtrij moet minimaal de . hebben duw() functie en de pop () functie. De duw() functie voegt een nieuw element toe aan de achterkant. Voor de normale wachtrij, de pop () functie verwijdert het eerste element dat ooit is ingedrukt. Voor de prioriteitswachtrij, de pop () functie verwijdert het element met de hoogste prioriteit, wat de grootste of de kleinste kan zijn, afhankelijk van het bestelschema.

Om de C++ priority_queue te gebruiken, moet het programma beginnen met code zoals:







#erbij betrekken
#erbij betrekken
gebruik makend van naamruimteuur;

Het bevat de wachtrijbibliotheek in het programma.



Om verder te kunnen lezen, moet de lezer een basiskennis van C++ hebben gehad.



Artikel Inhoud

Basisconstructie

De datastructuur moet eerst worden opgebouwd 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-rij<type>wachtrijnaam;

Met deze syntaxis wordt de grootste waarde het eerst verwijderd. Een voorbeeld van de instantie is:

prioriteits-rij<int>pq;

of



prioriteits-rij<char>pq;

De 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-rij<type, vector<zelfde type>, vergelijken>pq;

Een voorbeeld van deze instantie is:

prioriteits-rij<int, vector<int>, minder<int> >pq;

Let op de opening tussen > en > aan het einde van de aangifte. Dit om verwarring met >> te voorkomen. De standaardvergelijkingscode is minder, wat betekent dat de grootste, en niet noodzakelijk de eerste waarde, als eerste wordt verwijderd. De creatieverklaring kan dus eenvoudig worden geschreven als:

prioriteits-rij<int, vector<int> >pq;

Als de minste waarde eerst moet worden verwijderd, moet de instructie zijn:

prioriteits-rij<int, vector<int>, groter<int> >pq;

Belangrijke 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:

prioriteits-rij<int>pq;

blz.duw(10);
blz.duw(30);
blz.duw(twintig);
blz.duw(vijftig);
blz.duw(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, wordt het element met de kleinste waarde verwijderd. Als het opnieuw wordt aangeroepen, verwijdert het het volgende element met de kleinste waarde van de rest; opnieuw wordt aangeroepen, verwijdert het de volgende kleinste aanwezige waarde, enzovoort. Het keert leeg terug. De volgende code illustreert dit:

prioriteits-rij<char, vector<char>, groter<int> >pq;
blz.duw('tot');blz.duw('C');blz.duw('B');blz.duw('En');blz.duw('NS');

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 pop () functie verwijdert de volgende waarde met de hoogste prioriteit, maar retourneert deze niet, zoals pop () is een lege functie. Gebruik de bovenkant() functie om de waarde met de hoogste prioriteit te kennen die vervolgens moet worden verwijderd. De bovenkant() 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:

prioriteits-rij<char, vector<char>, groter<int> >pq;
blz.duw('tot');blz.duw('C');blz.duw('B');blz.duw('En');blz.duw('NS');
char1l=blz.bovenkant();blz.knal();
char2l=blz.bovenkant();blz.knal();
char3l=blz.bovenkant();blz.knal();
char4l=blz.bovenkant();blz.knal();
char5l=blz.bovenkant();blz.knal();

kosten<<1l<<''<<2l<<''<<3l<<''<<4l<<''<<5l<<'N';

De uitvoer is 'a' 'b' 'c' 'd' 'e'.

De lege() functie
Als een programmeur de bovenkant() functie op een lege prioriteit_wachtrij, na de succesvolle compilatie, zou hij een foutmelding ontvangen zoals:

segmentatie fout(kern gedumpt)

Controleer dus altijd of de prioriteitswachtrij niet leeg is voordat u de bovenkant() 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-rij<int>pq;
inti1= 10; inti2= 30; inti3= twintig; inti4= vijftig; inti5= 40;
blz.duw(i1);blz.duw(i2);blz.duw(i3);blz.duw(i4);blz.duw(i5);

terwijl(!blz.leeg())
{
kosten <<blz.bovenkant() << '';
blz.knal();
}
kosten << 'N';

Andere prioriteitswachtrijfuncties

De maat () Functie:
Deze functie retourneert de lengte van de prioriteitswachtrij, zoals de volgende code illustreert:

prioriteits-rij<int>pq;
inti1= 10; inti2= 30; inti3= twintig; inti4= vijftig; inti5= 40;
blz.duw(i1);blz.duw(i2);blz.duw(i3);blz.duw(i4);blz.duw(i5);

intlen=blz.maat();
kosten <<len<< 'N';

De uitvoer is 5.

De swap()-functie
Als twee priority_queues van hetzelfde type en dezelfde grootte zijn, kunnen ze door deze functie worden verwisseld, zoals de volgende code laat zien:

prioriteits-rij<int>pq1;
inti1= 10; inti2= 30; inti3= twintig; inti4= vijftig; inti5= 40;
pq1.duw(i1);pq1.duw(i2);pq1.duw(i3);pq1.duw(i4);pq1.duw(i5);

prioriteits-rij<int>pqA;
inthet1= 1; inthet2= 3; inthet3= 2; inthet4= 5; inthet5= 4;
pqA.duw(het1);pqA.duw(het2);pqA.duw(het3);pqA.duw(het4);pqA.duw(het5);

pq1.ruil(pqA);

terwijl(!pq1.leeg())
{
kosten <<pq1.bovenkant() << '';
pq1.knal();
} kosten<<'N';

terwijl(!pqA.leeg())
{
kosten <<pqA.bovenkant() << '';
pqA.knal();
} kosten<<'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:

prioriteits-rij<int>pq1;
inti1= 10; inti2= 30; inti3= twintig; inti4= vijftig; inti5= 40;
pq1.plaats(i1);pq1.plaats(i2);pq1.plaats(i3);pq1.plaats(i4);pq1.plaats(i5);

terwijl(!pq1.leeg())
{
kosten <<pq1.bovenkant() << '';
pq1.knal();
} kosten<<'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:

#erbij betrekken
prioriteits-rij<snaar>pq1;
tekenreeks s1=snaar('pen'), s2=snaar('potlood'), s3=snaar('werkboek'), s4=snaar('tekstboek'), s5=snaar('heerser');

pq1.duw(s1);pq1.duw(s2);pq1.duw(s3);pq1.duw(s4);pq1.duw(s5);
terwijl(!pq1.leeg())
{
kosten <<pq1.bovenkant() << '';
pq1.knal();
} kosten<<'N';

De uitvoer is:

 tekstboek  liniaal  potlood  pen  oefenboek

Andere prioriteitswachtrijconstructies

Expliciete creatie van een vector
Een prioriteitswachtrij kan expliciet worden gemaakt op basis van een vector, zoals de volgende code laat zien:

#erbij betrekken
vector<int>vtr= {10,30,twintig,vijftig,40};

prioriteits-rij<int>pq(vtr.beginnen(), vtr.einde());

terwijl(!blz.leeg())
{
kosten <<blz.bovenkant() << '';
blz.knal();
} kosten<<'N';

De output is: 50 40 30 20 10. Deze keer moet ook de vectorheader 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-rij<int, vector<int>, groter>int> >pq(vtr.beginnen(), vtr.einde());

Expliciete creatie vanuit een array
Een prioriteitswachtrij kan expliciet worden gemaakt op basis van een array, zoals de volgende code laat zien:

intarr[] = {10,30,twintig,vijftig,40};

prioriteits-rij<int>pq(arr, arr+5);

terwijl(!blz.leeg())
{
kosten <<blz.bovenkant() << '';
blz.knal();
} kosten<<'N';

De output is: 50 40 30 20 10. De argumenten voor de constructorfunctie nemen de start- en eindpointers van de array. arr retourneert de startpointer, arr+5 retourneert de pointer net voorbij de array, en 5 is de grootte van de array. Het gegevenstype voor de array 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-rij<int, vector<int>, groter<int> >pq(arr, arr+5);

Opmerking: 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 getallen zijn kleiner dan deze drie getallen, 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 nummers 80 en 81 zijn kleiner dan 84. De nummers 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, duw(), voegt een nieuwe waarde toe aan de wachtrij. De ledenfunctie, bovenkant(), leest de hoogste waarde in de wachtrij. De ledenfunctie, pop (), 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 doordat deze 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.