C ++

Hvordan bruke C ++ Priority_queue?

Hvordan bruke C ++ Priority_queue?
I C ++ er en kø en listedatastruktur der det første elementet som skal settes i listen er det første elementet som skal fjernes når fjerning skal finne sted. En prioritetskø i C ++ er lik, men har en viss rekkefølge; det er elementet med størst verdi som fjernes først. Prioritetskøen kan fortsatt konfigureres slik at det er elementet med minst verdi som fjernes først. Enhver kø må ha minst trykk() funksjon og pop () funksjon. De trykk() funksjonen legger til et nytt element på baksiden. For den normale køen, er pop () fjerner det første elementet som noen gang er presset inn. For prioritetskøen, pop () funksjonen fjerner elementet med høyest prioritet, som kan være den største eller minste, avhengig av bestillingsskjemaet.

For å kunne bruke C ++ -prioritet_queue, bør programmet begynne med kode som:

#inkludere
#inkludere
bruker navneområde std;

Den inkluderer købiblioteket i programmet.

For å kunne fortsette å lese, skulle leseren ha hatt en grunnleggende kunnskap om C++.

Artikkelinnhold

  • Innledning - se ovenfor
  • Grunnleggende konstruksjon
  • Viktige medlemsfunksjoner
  • Andre prioriterte køfunksjoner
  • Strengdata
  • Andre prioritetskøkonstruksjoner
  • Konklusjon

Grunnleggende konstruksjon

Datastrukturen må først konstrueres før den kan brukes. Konstruksjon her betyr å sette i gang et objekt fra køklassen i biblioteket. Køobjektet må da ha et navn gitt av programmereren. Den enkleste syntaksen for å opprette en prioritetskø er:

prioritets_kjøp kønavn;

Med denne syntaksen fjernes den største verdien først. Et eksempel på instantiering er:

prioritets_kjøp pq;

eller

prioritets_kjøp pq;

Vektoren og deken er to datastrukturer i C++. Det kan opprettes en prioritets_kø med hver av dem. Syntaksen for å opprette en prioritert kø fra vektorstrukturen er:

prioritets_kjøp, sammenlign> pq;

Et eksempel på denne instantiasjonen er:

prioritets_kjøp, mindre > pq;

Legg merke til gapet mellom> og> på slutten av erklæringen. Dette er for å forhindre forvirring med >>. Standard sammenligningskoden er “mindre”, Som betyr den største, og ikke nødvendigvis den første verdien, ville bli fjernet først. Så, opprettelseserklæringen kan ganske enkelt skrives som:

prioritets_kjøp > pq;

Hvis den minste verdien først skal fjernes, må uttalelsen være:

prioritets_kjøp, større > pq;

Viktige medlemsfunksjoner

Trykk () -funksjonen
Denne funksjonen skyver en verdi, som er dens argument, inn i prioritets_køen. Den returnerer ugyldig. Følgende kode illustrerer dette:

prioritets_kjøp pq;
pq.trykk (10);
pq.trykk (30);
pq.trykk (20);
pq.trykk (50);
pq.trykk (40);

Denne prioritetskøen har mottatt 5 heltallverdier i størrelsesorden 10, 30, 20, 50, 40. Hvis alle disse elementene skal poppes ut av prioritetskøen, vil de komme ut i størrelsesorden 50, 40, 30, 20, 10.

Pop () -funksjonen
Denne funksjonen fjerner verdien med høyeste prioritet fra prioritet_køen. Hvis sammenligningskoden er “større”, Så fjerner det elementet med den minste verdien. Hvis det kalles på nytt, fjerner det neste element med den minste verdien av resten; kalt igjen, fjerner den neste minste verdi nåværende, og så videre. Den returnerer ugyldig. Følgende kode illustrerer dette:

prioritets_kjøp, større > pq;
pq.skyv ('a'); pq.trykk ('c'); pq.skyv ('b'); pq.skyv ('e'); pq.skyv ('d');

Merk at for å ringe til en medlemsfunksjon, må navnet på objektet følges av en prikk, og deretter funksjonen.

Toppen () -funksjonen
De pop () funksjonen fjerner neste verdi med høyeste prioritet, men returnerer den ikke, som pop () er en tom funksjon. Bruke topp() funksjon for å vite verdien av høyeste prioritet som må fjernes neste gang. De topp() funksjonen returnerer en kopi av verdien av høyeste prioritet i prioritet_køen. Følgende kode, der neste verdi med høyeste prioritet er minst verdi, illustrerer dette

prioritets_kjøp, større > pq;
pq.skyv ('a'); pq.trykk ('c'); pq.skyv ('b'); pq.skyv ('e'); pq.skyv ('d');
char ch1 = pq.topp(); pq.pop ();
char ch2 = pq.topp(); pq.pop ();
char ch3 = pq.topp(); pq.pop ();
char ch4 = pq.topp(); pq.pop ();
char ch5 = pq.topp(); pq.pop ();
cout<Utgangen er 'a "b" c "d" e'.

Den tomme () funksjonen
Hvis en programmerer bruker topp() funksjon på en tom prioritet_queue, etter vellykket kompilering, ville han motta en feilmelding som:

Segmenteringsfeil (kjernedumpet)

Så sjekk alltid om prioritetskøen ikke er tom før du bruker topp() funksjon. De tømme() medlemsfunksjon returnerer en bool, sant, hvis køen er tom, og falsk hvis køen ikke er tom. Følgende kode illustrerer dette:

prioritets_kjøp pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.trykk (i1); pq.trykk (i2); pq.trykk (i3); pq.trykk (i4); pq.trykk (i5);
samtidig som(!pq.tømme())

cout << pq.top() << ";
pq.pop ();

cout << '\n';

Andre prioriterte køfunksjoner

Størrelsen () Funksjon
Denne funksjonen returnerer lengden på prioritetskøen, som følgende kode illustrerer:

prioritets_kjøp pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.trykk (i1); pq.trykk (i2); pq.trykk (i3); pq.trykk (i4); pq.trykk (i5);
int len ​​= pq.størrelse();
cout << len << '\n';

Utgangen er 5.

Bytt () -funksjonen
Hvis to prioritetskvoter er av samme type og størrelse, kan de byttes med denne funksjonen, som følgende kode viser:

prioritets_kjøp pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.trykk (i1); pq1.trykk (i2); pq1.trykk (i3); pq1.trykk (i4); pq1.trykk (i5);
prioritets_kjøp pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.trykk (it1); pqA.trykk (it2); pqA.trykk (it3); pqA.trykk (it4); pqA.trykk (it5);
pq1.bytte (pqA);
samtidig som(!pq1.tømme())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
samtidig som(!pqA.tømme())

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

Utgangen er:

5 4 3 2 1
50 40 30 20 10

The emplace () Fuction
De emplace () funksjonen ligner på trykkfunksjonen. Følgende kode illustrerer dette:

prioritets_kjøp 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);
samtidig som(!pq1.tømme())

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

Utgangen er:

50 40 30 20 10

Strengdata

Når du sammenligner strenger, bør strengklassen brukes og ikke direkte bruk av strenglitteralene fordi den sammenligner pekere og ikke de faktiske strengene. Følgende kode viser hvordan strengklassen brukes:

#inkludere
prioritets_kjøp pq1;
streng s1 = streng ("penn"), s2 = streng ("blyant"), s3 = streng ("øvelsesbok"), s4 = streng ("tekstbok"), s5 = streng ("linjal");
pq1.trykk (s1); pq1.trykk (s2); pq1.trykk (s3); pq1.trykk (s4); pq1.trykk (s5);
samtidig som(!pq1.tømme())

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

Utgangen er:

tekstbok linjal blyantpenn øvelsesbok

Andre prioritetskøkonstruksjoner

Eksplisitt oppretting fra en vektor
En prioritetskø kan opprettes eksplisitt fra en vektor som følgende kode viser:

#inkludere
vektor vtr = 10, 30, 20, 50, 40;
prioritets_kjøp pq (vtr.begynn (), vtr.slutt());
samtidig som(!pq.tømme())

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

Utgangen er: 50 40 30 20 10. Denne gangen må også vektoroverskriften inkluderes. Argumentene for konstruktorfunksjonen tar start- og sluttpekerne til vektoren. Datatypen for vektoren og datatypen for prioritets_køen må være den samme.

For å prioritere minst mulig, vil erklæringen for konstruktøren være:

prioritets_kjøp, større> int>> pq (vtr.begynn (), vtr.slutt());

Eksplisitt skapelse fra en matrise
En prioritetskø kan opprettes eksplisitt fra en matrise som følgende kode viser:

int arr [] = 10, 30, 20, 50, 40;
prioritets_kjøp pq (arr, arr + 5);
samtidig som(!pq.tømme())

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

Utgangen er: 50 40 30 20 10. Argumentene for konstruktorfunksjonen tar start- og sluttpekerne til matrisen. arr returnerer startpekeren, "arr + 5" returnerer pekeren like forbi matrisen, og 5 er størrelsen på matrisen. Datatypen for matrisen og datatypen for prioritets_køen må være den samme.

For å prioritere minst mulig, vil erklæringen for konstruktøren være:

prioritets_kjøp, større > pq (arr, arr + 5);

Merk: I C ++ kalles Priority_queue faktisk en adapter, ikke bare en container.

Tilpasset sammenligningskode

Å ha alle verdiene i prioritetskøen stigende eller alt synkende er ikke det eneste alternativet for prioritetskøen. For eksempel er en liste over 11 heltall for en maksimal bunke:

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

Den høyeste verdien er 88. Dette etterfølges av to tall: 86 og 87, som er mindre enn 88. Resten av tallene er mindre enn disse tre tallene, men egentlig ikke i orden. Det er to tomme celler i listen. Tallene 84 og 82 er mindre enn 86. Tallene 79 og 74 er mindre enn 87. Tallene 80 og 81 er mindre enn 84. Tallene 64 og 69 er mindre enn 79.

Plasseringen av tallene følger maks-heap-kriteriene - se senere. For å kunne tilby et slikt oppsett for prioritets_kø, må programmereren oppgi sin egen sammenligningskode - se senere.

Konklusjon

En C ++ -prioritetskø er en først-inn-først-ut-kø. Medlemsfunksjonen, trykk(), legger til en ny verdi i køen. Medlemsfunksjonen, topp(), leser toppverdien i køen. Medlemsfunksjonen, pop (), fjerner uten å returnere toppverdien til køen. Medlemsfunksjonen, tømme(), sjekker om køen er tom. Priority_queue skiller seg imidlertid fra køen, ved at den følger en prioritetsalgoritme. Det kan være størst, fra første til siste, eller minst, fra første til siste. Kriteriene (algoritmen) kan også defineres som programmerer.

Slik installerer du League Of Legends på Ubuntu 14.04
Hvis du er fan av League of Legends, er dette en mulighet for deg å prøvekjør League of Legends. Merk at LOL støttes på PlayOnLinux hvis du er en linu...
Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...
Installer nyeste Dolphin Emulator for Gamecube & Wii på Linux
Dolphin Emulator lar deg spille de valgte Gamecube- og Wii-spillene dine på Linux Personal Computers (PC). Som en fritt tilgjengelig og åpen kildekod...