C ++

Kako uporabljati C ++ Priority_queue?

Kako uporabljati C ++ Priority_queue?
V C ++ je čakalna vrsta podatkovna struktura seznama, kjer je prvi element, ki ga je treba dati na seznam, prvi element, ki ga je treba odstraniti, ko naj bi se odstranilo. Prednostna vrsta v jeziku C ++ je podobna, vendar ima nekaj vrstnega reda; najprej se odstrani element z največjo vrednostjo. Čakalno vrsto prioritet je še vedno mogoče konfigurirati tako, da je najprej odstranjen element z najmanjšo vrednostjo. Vsaka vrsta mora imeti vsaj push () funkcijo in pop () funkcijo. The push () funkcija doda nov element zadaj. Za običajno čakalno vrsto je pop () funkcija odstrani prvi element, ki je bil kdaj koli potisnjen. Za prednostno vrsto je pop () funkcija odstrani element z najvišjo prioriteto, ki je lahko največja ali najmanjša, odvisno od sheme naročanja.

Če želite uporabiti čakalno vrsto C ++ prioriteto, se mora program začeti s kodo, kot je:

#include
#include
uporaba imenskega prostora std;

V program vključuje knjižnico čakalnih vrst.

Da bi lahko nadaljeval z branjem, bi moral bralec imeti osnovno znanje jezika C++.

Vsebina članka

  • Uvod - glej zgoraj
  • Osnovna konstrukcija
  • Pomembne funkcije člana
  • Druge funkcije prednostne čakalne vrste
  • Niz podatkov
  • Druge konstrukcije prednostne vrste
  • Zaključek

Osnovna konstrukcija

Pred uporabo je treba najprej sestaviti podatkovno strukturo. Konstrukcija tukaj pomeni instanciranje predmeta iz razreda čakalne vrste knjižnice. Nato mora imeti predmet čakalne vrste ime, ki mu ga je dal programer. Najenostavnejša sintaksa za ustvarjanje prednostne čakalne vrste je:

čakalna_vrst queueName;

S to sintakso se najprej odstrani največja vrednost. Primer instanciranja je:

čakalna_vrst pq;

ali

čakalna vrsta_prednost pq;

Vektor in deque sta dve podatkovni strukturi v C++. Čakalno vrsto prioritet lahko ustvarite z enim od njih. Sintaksa za ustvarjanje prednostne čakalne vrste iz vektorske strukture je:

čakalna_vrst, primerjaj> pq;

Primer tega primerka je:

čakalna_vrst, manj > pq;

Upoštevajte vrzel med> in> na koncu izjave. To je namenjeno preprečevanju zmede z >>. Privzeta primerjalna koda je »manj", Kar pomeni, da bi bila najprej odstranjena največja in ne nujno prva vrednost. Izjavo o ustvarjanju lahko torej preprosto zapišemo kot:

čakalna vrsta_prednost > pq;

Če je najprej treba odstraniti najmanjšo vrednost, mora biti stavek:

čakalna vrsta_prednost, večje > pq;

Pomembne funkcije člana

Funkcija push ()
Ta funkcija potisne vrednost, ki je njen argument, v prioritetno_vrsto. Vrne se prazno. Naslednja koda to ponazarja:

čakalna vrsta_prednost pq;
pq.potisk (10);
pq.potisk (30);
pq.potisk (20);
pq.potisk (50);
pq.potisk (40);

Ta vrsta_prednosti je prejela 5 celoštevilskih vrednosti v vrstnem redu 10, 30, 20, 50, 40. Če želimo vse te elemente izvleči iz prednostne čakalne vrste, bodo prikazani v vrstnem redu 50, 40, 30, 20, 10.

Funkcija pop ()
Ta funkcija iz prior__queue odstrani vrednost z najvišjo prioriteto. Če je primerjalna koda »večja”, Nato bo odstranil element z najmanjšo vrednostjo. Če ga ponovno pokličete, odstrani naslednji element z najmanjšo vrednostjo preostalega; znova pokličemo, odstrani naslednjo najmanjšo prisotno vrednost itd. Vrne se prazno. Naslednja koda to ponazarja:

čakalna_vrst, večje > pq;
pq.push ('a'); pq.potisnite ('c'); pq.potisnite ('b'); pq.push ('e'); pq.potisnite ('d');

Če želite poklicati funkcijo člana, mora imenu predmeta slediti pika in nato funkcija.

Funkcija vrh ()
The pop () funkcija odstrani naslednjo vrednost z najvišjo prioriteto, vendar je ne vrne kot pop () je void funkcija. Uporabi zgoraj () funkcijo, da bi ugotovili vrednost najvišje prioritete, ki jo je treba odstraniti. The zgoraj () funkcija vrne kopijo vrednosti najvišje prioritete v vrsti_prednosti. Naslednja koda, kjer je naslednja vrednost z najvišjo prioriteto najmanjša vrednost, to ponazarja

čakalna_vrst, večje > pq;
pq.push ('a'); pq.potisnite ('c'); pq.potisnite ('b'); pq.push ('e'); pq.potisnite ('d');
char ch1 = pq.zgoraj (); pq.pop ();
char ch2 = pq.zgoraj (); pq.pop ();
char ch3 = pq.zgoraj (); pq.pop ();
char ch4 = pq.zgoraj (); pq.pop ();
char ch5 = pq.zgoraj (); pq.pop ();
cout<Izhod je 'a' b 'c' d 'e'.

Funkcija empty ()
Če programer uporablja zgoraj () v prazni čakalni vrsti prioritet, po uspešnem prevajanju bo prejel sporočilo o napaki, kot je:

Napaka segmentacije (jedro odloženo)

Torej, vedno preverite, ali prednostna vrsta ni prazna, preden uporabite zgoraj () funkcijo. The prazno() funkcija member vrne bool, true, če je vrsta prazna, in false, če vrsta ni prazna. Naslednja koda to ponazarja:

čakalna_vrst pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.potisk (i1); pq.potisk (i2); pq.potisk (i3); pq.potisk (i4); pq.potisk (i5);
medtem(!pq.prazno())

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

cout << '\n';

Druge funkcije prednostne čakalne vrste

Velikost () Funkcija
Ta funkcija vrne dolžino prednostne čakalne vrste, kot ponazarja naslednja koda:

čakalna_vrst pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.potisk (i1); pq.potisk (i2); pq.potisk (i3); pq.potisk (i4); pq.potisk (i5);
int len ​​= pq.velikost ();
cout << len << '\n';

Izhod je 5.

Funkcija zamenjave ()
Če sta dve vrsti_prednosti enake vrste in velikosti, ju lahko ta funkcija zamenja, kot kaže naslednja koda:

čakalna vrsta_prednost pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.potisk (i1); pq1.potisk (i2); pq1.potisk (i3); pq1.potisk (i4); pq1.potisk (i5);
čakalna_vrst pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.potisnite (it1); pqA.potisnite (it2); pqA.potisnite (it3); pqA.potisnite (it4); pqA.potisnite (it5);
pq1.zamenjava (pqA);
medtem(!pq1.prazno())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
medtem(!pqA.prazno())

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

Rezultat je:

5 4 3 2 1
50 40 30 20 10

Emplace () Fukcija
The emplace () funkcija je podobna funkciji potisk. Naslednja koda to ponazarja:

čakalna vrsta_prednost 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);
medtem(!pq1.prazno())

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

Rezultat je:

50 40 30 20 10

Nizov

Pri primerjavi nizov je treba uporabiti razred nizov in ne neposredno uporabo nizovnih literal, ker bi primerjali kazalce in ne dejanske nize. Naslednja koda prikazuje, kako se uporablja razred nizov:

#include
čakalna_vrst pq1;
niz s1 = niz ("pero"), s2 = niz ("svinčnik"), s3 = niz ("vadnica"), s4 = niz ("učbenik"), s5 = niz ("ravnilo");
pq1.potisk (s1); pq1.potisk (s2); pq1.potisk (s3); pq1.potisk (s4); pq1.potisk (s5);
medtem(!pq1.prazno())

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

Rezultat je:

učbenik knjigo ravnilo svinčnik peresnica

Druge konstrukcije prednostne vrste

Izrecno ustvarjanje iz vektorja
Prioritetno čakalno vrsto lahko izrecno ustvarite iz vektorja, kot prikazuje naslednja koda:

#include
vektor vtr = 10, 30, 20, 50, 40;
čakalna vrsta_prednost pq (vtr.begin (), vtr.konec ());
medtem(!pq.prazno())

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

Rezultat je: 50 40 30 20 10. Tokrat je treba vključiti tudi glavo vektorja. Argumenti za konstruktorsko funkcijo upoštevajo začetni in končni kazalnik vektorja. Podatkovni tip za vektor in podatkovni tip za prioritetno_vrsto morata biti enaka.

Da bi bila najmanjša vrednost prednostna naloga, bi bila izjava za konstruktor:

čakalna vrsta_prednost, večji> int>> pq (vtr.begin (), vtr.konec ());

Izrecno ustvarjanje iz polja
Prioritetno vrsto lahko iz matrike izrecno ustvarite, kot prikazuje naslednja koda:

int arr [] = 10, 30, 20, 50, 40;
čakalna vrsta_prednost pq (arr, arr + 5);
medtem(!pq.prazno())

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

Rezultat je: 50 40 30 20 10. Argumenti za konstruktorsko funkcijo upoštevajo začetni in končni kazalnik polja. arr vrne začetni kazalec, »arr + 5« vrne kazalec tik mimo polja, 5 pa je velikost polja. Podatkovni tip za matriko in podatkovni tip za prioritetno_vrsto morata biti enaka.

Da bi bila najmanjša vrednost prednostna naloga, bi bila izjava za konstruktor:

čakalna vrsta_prednost, večje > pq (arr, arr + 5);

Opomba: V jeziku C ++ se prior_queue dejansko imenuje adapter, ne le vsebnik.

Primerjalna koda po meri

Vse vrednosti v prioritetni čakalni vrsti naraščajoče ali vse padajoče ni edina možnost za prednostno čakalno vrsto. Na primer, seznam 11 celih števil za največjo kopico je:

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

Najvišja vrednost je 88. Nato sledita dve številki: 86 in 87, ki sta manj kot 88. Preostale številke so manjše od teh treh številk, vendar ne v resnici. Na seznamu sta dve prazni celici. Številki 84 in 82 sta manjši od 86. Številki 79 in 74 sta manjši od 87. Številki 80 in 81 sta manjši od 84. Številki 64 in 69 sta manjši od 79.

Umestitev številk sledi merilom največje količine - glej kasneje. Za zagotovitev takšne sheme za prioritetno_logo mora programer zagotoviti svojo primerjalno kodo - glej kasneje.

Zaključek

Čakalna vrsta C ++ prioritetna vrsta je vrsta prvi v prvem. Funkcija člana, push (), doda novo vrednost v čakalno vrsto. Funkcija člana, zgoraj (), prebere najvišjo vrednost v čakalni vrsti. Funkcija člana, pop (), odstrani, ne da bi vrnil najvišjo vrednost čakalne vrste. Funkcija člana, prazno(), preveri, ali je vrsta prazna. Vendar se prednostna_vrst razlikuje od čakalne vrste, saj sledi nekaterim prednostnim algoritmom. Lahko je največji, od prvega do zadnjega ali najmanj, od prvega do zadnjega. Merila (algoritem) lahko določite tudi s programerjem.

Kako razviti igro na Linuxu
Pred desetletjem le malo uporabnikov Linuxa napoveduje, da bo njihov najljubši operacijski sistem nekoč priljubljena igralna platforma za komercialne ...
Odprtokodna vrata komercialnih igralnih sistemov
Brezplačne, odprtokodne in medplatformacijske igre, ki jih lahko uporabite za igranje starih, pa tudi nekaterih dokaj nedavnih naslovov iger. V tem čl...
Najboljše igre ukazne vrstice za Linux
Ukazna vrstica ni le vaš največji zaveznik pri uporabi Linuxa - lahko je tudi vir zabave, saj jo lahko uporabljate za igranje številnih zabavnih iger,...