C ++

Sådan bruges C ++ Priority_queue?

Sådan bruges C ++ Priority_queue?
I C ++ er en kø en listedatastruktur, hvor det første element, der skal placeres på listen, er det første element, der skal fjernes, når fjernelsen skal finde sted. En prioritetskø i C ++ er ens, men har en vis rækkefølge; det er det element med den største værdi, der fjernes først. Prioritetskøen kan stadig konfigureres, så det er det element med den mindste værdi, der først fjernes. Enhver kø skal mindst have skubbe() funktion og pop () fungere. Det skubbe() funktion tilføjer et nyt element på bagsiden. For den normale kø, er pop () fjerner det første element, der nogensinde er skubbet ind. For prioritetskøen er pop () -funktionen fjerner elementet med den højeste prioritet, hvilket kan være det største eller mindste afhængigt af bestillingsskemaet.

For at kunne bruge C ++ -prioritet_queue skal programmet begynde med kode som:

#omfatte
#omfatte
ved hjælp af namespace std;

Det inkluderer købiblioteket i programmet.

For at fortsætte med at læse, skulle læseren have haft en grundlæggende viden om C++.

Artikelindhold

  • Introduktion - se ovenfor
  • Grundlæggende konstruktion
  • Vigtige medlemsfunktioner
  • Andre prioritets køfunktioner
  • Strengdata
  • Andre prioritetskøkonstruktioner
  • Konklusion

Grundlæggende konstruktion

Datastrukturen skal konstrueres først, før den kan bruges. Konstruktion betyder her, at du genoptager et objekt fra bibliotekets køklasse. Køobjektet skal derefter have et navn givet af programmøren. Den enkleste syntaks til oprettelse af en prioritetskø er:

prioritets-kø kønavn;

Med denne syntaks fjernes den største værdi først. Et eksempel på instantieringen er:

prioritets-kø pq;

eller

prioritets-kø pq;

Vektoren og deken er to datastrukturer i C++. En prioritets_kø kan oprettes med en af ​​dem. Syntaksen for at oprette en prioritetskø fra vektorstrukturen er:

prioritets-kø, sammenligne> pq;

Et eksempel på denne instantiering er:

prioritets-kø, mindre > pq;

Bemærk afstanden mellem> og> i slutningen af ​​erklæringen. Dette er for at forhindre forveksling med >>. Standardsammenligningskoden er “mindre”, Hvilket betyder den største og ikke nødvendigvis den første værdi, ville blive fjernet først. Så oprettelseserklæringen kan simpelthen skrives som:

prioritets-kø > pq;

Hvis den mindste værdi først skal fjernes, skal udsagnet være:

prioritets-kø, større > pq;

Vigtige medlemsfunktioner

Push () -funktionen
Denne funktion skubber en værdi, som er dens argument, ind i prioritets_køen. Det returnerer ugyldigt. Følgende kode illustrerer dette:

prioritets-kø pq;
pq.skub (10);
pq.skub (30);
pq.skub (20);
pq.skub (50);
pq.skub (40);

Denne prioritetskø har modtaget 5 heltal værdier i størrelsesordenen 10, 30, 20, 50, 40. Hvis alle disse elementer skal poppes ud af prioritetskøen, kommer de ud i størrelsesordenen 50, 40, 30, 20, 10.

Pop () -funktionen
Denne funktion fjerner værdien med den højeste prioritet fra prioritets_køen. Hvis sammenligningskoden er “større”, Så fjerner det elementet med den mindste værdi. Hvis det kaldes igen, fjerner det det næste element med den mindste værdi af resten; kaldes igen, det fjerner den næste mindste værdi til stede osv. Det returnerer ugyldigt. Følgende kode illustrerer dette:

prioritets-kø, større > pq;
pq.skub ('a'); pq.skub ('c'); pq.skub ('b'); pq.skub ('e'); pq.skub ('d');

Bemærk, at for at kalde en medlemsfunktion skal objektets navn efterfølges af en prik og derefter funktionen.

Den øverste () funktion
Det pop () funktion fjerner den næste værdi med højeste prioritet, men returnerer den ikke som pop () er en ugyldig funktion. Brug top() funktion for at kende værdien af ​​højeste prioritet, der skal fjernes derefter. Det top() -funktionen returnerer en kopi af værdien med den højeste prioritet i prioritets_køen. Den følgende kode, hvor den næste værdi med højeste prioritet er den mindste værdi, illustrerer dette

prioritets-kø, større > pq;
pq.skub ('a'); pq.skub ('c'); pq.skub ('b'); pq.skub ('e'); pq.skub ('d');
char ch1 = pq.top(); pq.pop ();
char ch2 = pq.top(); pq.pop ();
char ch3 = pq.top(); pq.pop ();
char ch4 = pq.top(); pq.pop ();
char ch5 = pq.top(); pq.pop ();
cout<Outputtet er 'a "b" c "d" e'.

Den tomme () funktion
Hvis en programmør bruger top() funktion på en tom prioritet_queue, efter den vellykkede kompilering, ville han modtage en fejlmeddelelse som:

Segmenteringsfejl (kerne dumpet)

Så kontroller altid, om prioritetskøen ikke er tom, før du bruger top() fungere. Det tom() medlemsfunktion returnerer en bool, sand, hvis køen er tom, og falsk, hvis køen ikke er tom. Følgende kode illustrerer dette:

prioritets-kø pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.skub (i1); pq.skub (i2); pq.skub (i3); pq.skub (i4); pq.skub (i5);
mens(!pq.tom())

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

cout << '\n';

Andre prioritets køfunktioner

Funktionen størrelse ()
Denne funktion returnerer længden af ​​prioritetskøen, som følgende kode illustrerer:

prioritets-kø pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.skub (i1); pq.skub (i2); pq.skub (i3); pq.skub (i4); pq.skub (i5);
int len ​​= pq.størrelse();
cout << len << '\n';

Outputtet er 5.

Swap-funktionen ()
Hvis to prioritetskvoter er af samme type og størrelse, kan de byttes med denne funktion, som følgende kode viser:

prioritets-kø pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.skub (i1); pq1.skub (i2); pq1.skub (i3); pq1.skub (i4); pq1.skub (i5);
prioritets-kø pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.skub (it1); pqA.skub (it2); pqA.skub (it3); pqA.skub (it4); pqA.skub (it5);
pq1.swap (pqA);
mens(!pq1.tom())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
mens(!pqA.tom())

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

Outputtet er:

5 4 3 2 1
50 40 30 20 10

Emplace () Fuction
Det placere () funktion svarer til push-funktionen. Følgende kode illustrerer dette:

prioritets-kø pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.placere (i1); pq1.placere (i2); pq1.emplace (i3); pq1.emplace (i4); pq1.emplace (i5);
mens(!pq1.tom())

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

Outputtet er:

50 40 30 20 10

Strengdata

Når man sammenligner strenge, skal strengklassen bruges og ikke den direkte brug af strenglitteralerne, fordi den sammenligner markører og ikke de faktiske strenge. Følgende kode viser, hvordan strengklassen bruges:

#omfatte
prioritets-kø pq1;
streng s1 = streng ("pen"), s2 = streng ("blyant"), s3 = streng ("træningsbog"), s4 = streng ("tekstbog"), s5 = streng ("lineal");
pq1.skub (s1); pq1.skub (s2); pq1.skub (s3); pq1.skub (s4); pq1.skub (s5);
mens(!pq1.tom())

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

Outputtet er:

lærebog lineal blyant pen træningsbog

Andre prioritetskøkonstruktioner

Eksplicit oprettelse af en vektor
En prioritetskø kan oprettes eksplicit fra en vektor, som følgende kode viser:

#omfatte
vektor vtr = 10, 30, 20, 50, 40;
prioritets-kø pq (vtr.begynde (), vtr.ende());
mens(!pq.tom())

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

Outputtet er: 50 40 30 20 10. Denne gang skal vektoroverskriften også medtages. Argumenterne for konstruktionsfunktionen tager start- og slutpegerne på vektoren. Datatypen for vektoren og datatypen for prioritets_køen skal være den samme.

For at prioritere mindst mulig værdi er erklæringen til konstruktøren:

prioritets-kø, større> int>> pq (vtr.begynde (), vtr.ende());

Eksplicit oprettelse fra en matrix
En prioritetskø kan oprettes eksplicit fra en matrix, som følgende kode viser:

int arr [] = 10, 30, 20, 50, 40;
prioritets-kø pq (arr, arr + 5);
mens(!pq.tom())

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

Outputtet er: 50 40 30 20 10. Argumenterne for konstruktørfunktionen tager start- og slutpegerne i arrayet. arr returnerer startmarkøren, "arr + 5" returnerer markøren lige forbi arrayet, og 5 er størrelsen på arrayet. Datatypen for arrayet og datatypen for prioritet_queue skal være den samme.

For at prioritere mindst mulig værdi er erklæringen til konstruktøren:

prioritets-kø, større > pq (arr, arr + 5);

Bemærk: I C ++ kaldes Priority_queue faktisk en adapter, ikke kun en container.

Brugerdefineret sammenligningskode

At have alle værdier i prioritetskøen stigende eller alle faldende er ikke den eneste mulighed for prioritetskøen. For eksempel er en liste med 11 heltal for en maksimal bunke:

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

Den højeste værdi er 88. Dette efterfølges af to tal: 86 og 87, som er mindre end 88. Resten af ​​numrene er mindre end disse tre tal, men ikke rigtig i orden. Der er to tomme celler på listen. Tallene 84 og 82 er mindre end 86. Tallene 79 og 74 er mindre end 87. Tallene 80 og 81 er mindre end 84. Tallene 64 og 69 er mindre end 79.

Placeringen af ​​numrene følger max-heap-kriterierne - se senere. For at tilvejebringe en sådan ordning for prioritets_køen skal programmøren give sin egen sammenligningskode - se senere.

Konklusion

En C ++ -prioritetskø er en først-i-først-ud-kø. Medlemfunktionen, skubbe(), tilføjer en ny værdi til køen. Medlemfunktionen, top(), læser den øverste værdi i køen. Medlemfunktionen, pop (), fjerner uden at returnere den øverste værdi af køen. Medlemfunktionen, tom(), kontrollerer, om køen er tom. Priority_queue adskiller sig imidlertid fra køen, idet den følger en prioritetsalgoritme. Det kan være størst, fra første til sidste, eller mindst, fra første til sidste. Kriterierne (algoritme) kan også være programmørdefineret.

5 bedste arkadespil til Linux
I dag er computere seriøse maskiner, der bruges til spil. Hvis du ikke kan få den nye høje score, ved du hvad jeg mener. I dette indlæg vil du kende n...
Kamp om Wesnoth 1.13.6 Udvikling frigivet
Kamp om Wesnoth 1.13.6 udgivet i sidste måned, er den sjette udviklingsudgivelse i 1.13.x-serien, og den leverer en række forbedringer, især til bruge...
Sådan installeres League Of Legends på Ubuntu 14.04
Hvis du er fan af League of Legends, er dette en mulighed for dig at prøvekøre League of Legends. Bemærk, at LOL understøttes på PlayOnLinux, hvis du ...