Kako koristiti C ++ Priority_queue?

How Use C Priority_queue



U C ++ -u, red je struktura podataka popisa u kojoj je prvi element koji se stavlja na popis prvi element koji se uklanja kada se treba ukloniti. Red prioriteta u C ++ je sličan, ali ima određen redoslijed; to je element s najvećom vrijednošću koji se prvi uklanja. Red prioriteta se i dalje može konfigurirati tako da se prvi ukloni element s najmanjom vrijednošću. Svaki red mora imati barem gurnuti() funkciju i pop () funkcija. The gurnuti() funkcija dodaje novi element straga. Za normalni red čekanja, pop () funkcija uklanja prvi element koji je ikada uguran. Za red prioriteta, pop () funkcija uklanja element s najvišim prioritetom, koji bi mogao biti najveći ili najmanji, ovisno o shemi naručivanja.

Da bi se koristio C ++ prioritetni red, program bi trebao početi s kodom poput:







#uključi
#uključi
koristeći imenski prostorsati;

U program uključuje biblioteku redova.



Kako bi nastavio čitati, čitatelj je trebao imati osnovno znanje o C ++.



Sadržaj članka

Osnovna gradnja

Prije upotrebe potrebno je konstruirati strukturu podataka. Konstrukcija ovdje znači instanciranje objekta iz klase reda knjižnice. Objekt reda mora tada imati naziv koji mu je dao programer. Najjednostavnija sintaksa za stvaranje reda prioriteta je:





red_prioriteta<tip>queueName;

Pomoću ove sintakse prvo se uklanja najveća vrijednost. Primjer instalacije je:

red_prioriteta<int>pq;

ili



red_prioriteta<char>pq;

Vektor i deque su dvije strukture podataka u C ++. Redoslijed_prioriteta može se stvoriti s bilo kojim od njih. Sintaksa za stvaranje reda prioriteta iz vektorske strukture je:

red_prioriteta<vrsta, vektor<isti tip>, usporedi>pq;

Primjer ove instalacije je:

red_prioriteta<int, vektor<int>, manje<int> >pq;

Uočite jaz između> i> na kraju deklaracije. Time se sprječava zabuna s >>. Zadani kod za usporedbu je manji, što znači da bi se najveća, a ne nužno i prva vrijednost, prvo uklonila. Dakle, izjava o stvaranju može se jednostavno napisati kao:

red_prioriteta<int, vektor<int> >pq;

Ako se najprije mora ukloniti najmanja vrijednost, tada izraz mora biti:

red_prioriteta<int, vektor<int>, veći<int> >pq;

Važne funkcije člana

Funkcija push ()
Ova funkcija gura vrijednost, koja je njezin argument, u red priority_queue. Vraća ništavost. Sljedeći kod to ilustrira:

red_prioriteta<int>pq;

pqgurnuti(10);
pqgurnuti(30);
pqgurnuti(dvadeset);
pqgurnuti(pedeset);
pqgurnuti(40);

Ovaj prioritetni red primio je 5 cjelobrojnih vrijednosti u redoslijedu 10, 30, 20, 50, 40. Ako se svi ovi elementi iskaču iz reda prioriteta, oni će izaći u redoslijedu 50, 40, 30, 20, 10.

Funkcija pop ()
Ova funkcija uklanja iz prioritetnog reda vrijednosti s najvišim prioritetom. Ako je kod za usporedbu veći, tada će se ukloniti element s najmanjom vrijednošću. Ako se ponovno pozove, uklanja sljedeći element s najmanjom vrijednošću ostatka; ponovno pozvan, uklanja sljedeću najmanju prisutnu vrijednost itd. Vraća ništavost. Sljedeći kod to ilustrira:

red_prioriteta<char, vektor<char>, veći<int> >pq;
pqgurnuti('do');pqgurnuti('c');pqgurnuti('b');pqgurnuti('I');pqgurnuti('d');

Imajte na umu da za pozivanje funkcije člana naziv objekta mora biti popraćen točkom, a zatim i funkcija.

Funkcija vrh ()
The pop () funkcija uklanja sljedeću vrijednost najvećeg prioriteta, ali je ne vraća, kao pop () je funkcija void. Koristiti vrh() funkciju kako bi se znala vrijednost najvišeg prioriteta koju je potrebno ukloniti. The vrh() funkcija vraća kopiju vrijednosti najvećeg prioriteta u redu prioriteta. Sljedeći kôd, gdje je sljedeća vrijednost najvećeg prioriteta najmanja vrijednost, to ilustrira

red_prioriteta<char, vektor<char>, veći<int> >pq;
pqgurnuti('do');pqgurnuti('c');pqgurnuti('b');pqgurnuti('I');pqgurnuti('d');
charch1=pqvrh();pqpop();
charch2=pqvrh();pqpop();
charch3=pqvrh();pqpop();
charch4=pqvrh();pqpop();
charch5=pqvrh();pqpop();

trošak<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<' n';

Izlaz je 'a' 'b' 'c' 'd' 'e'.

Funkcija empty ()
Ako programer koristi vrh() funkciji na praznom redu prioriteta, nakon uspješne kompilacije primio bi poruku o pogrešci, poput:

Greška segmentacije(jezgra odbačena)

Dakle, uvijek provjerite nije li red prioriteta prazan prije korištenja vrh() funkcija. The prazan() funkcija članica vraća bool, true, ako je red prazan, i false ako red nije prazan. Sljedeći kod to ilustrira:

red_prioriteta<int>pq;
inti1= 10; inti2= 30; inti3= dvadeset; inti4= pedeset; inti5= 40;
pqgurnuti(i1);pqgurnuti(i2);pqgurnuti(i3);pqgurnuti(i4);pqgurnuti(i5);

dok(!pqprazan())
{
trošak <<pqvrh() << '';
pqpop();
}
trošak << ' n';

Ostale funkcije reda prioriteta

Funkcija size ()
Ova funkcija vraća duljinu reda prioriteta, kao što prikazuje sljedeći kôd:

red_prioriteta<int>pq;
inti1= 10; inti2= 30; inti3= dvadeset; inti4= pedeset; inti5= 40;
pqgurnuti(i1);pqgurnuti(i2);pqgurnuti(i3);pqgurnuti(i4);pqgurnuti(i5);

intlen=pqveličina();
trošak <<len<< ' n';

Izlaz je 5.

Funkcija swap ()
Ako su dva reda prioriteta iste vrste i veličine, tada ih ova funkcija može zamijeniti, kao što prikazuje sljedeći kôd:

red_prioriteta<int>pq1;
inti1= 10; inti2= 30; inti3= dvadeset; inti4= pedeset; inti5= 40;
pq1.gurnuti(i1);pq1.gurnuti(i2);pq1.gurnuti(i3);pq1.gurnuti(i4);pq1.gurnuti(i5);

red_prioriteta<int>pqA;
intto1= 1; intto2= 3; intit3= 2; intit4= 5; intit5= 4;
pqA.gurnuti(to1);pqA.gurnuti(to2);pqA.gurnuti(it3);pqA.gurnuti(it4);pqA.gurnuti(it5);

pq1.zamijeniti(pqA);

dok(!pq1.prazan())
{
trošak <<pq1.vrh() << '';
pq1.pop();
} trošak<<' n';

dok(!pqA.prazan())
{
trošak <<pqA.vrh() << '';
pqA.pop();
} trošak<<' n';

Izlaz je:

& emsp; 5 & emsp; 4 & emsp; 3 & emsp; 2 & emsp; 1
& emsp; 50 & emsp; 40 & emsp; 30 & emsp; 20 & emsp; 10

The emplace () Fuction
The staviti na položaj() funkcija je slična funkciji guranja. Sljedeći kod to ilustrira:

red_prioriteta<int>pq1;
inti1= 10; inti2= 30; inti3= dvadeset; inti4= pedeset; inti5= 40;
pq1.staviti na položaj(i1);pq1.staviti na položaj(i2);pq1.staviti na položaj(i3);pq1.staviti na položaj(i4);pq1.staviti na položaj(i5);

dok(!pq1.prazan())
{
trošak <<pq1.vrh() << '';
pq1.pop();
} trošak<<' n';

Izlaz je:

50 40 30 20 10

Podaci o nizovima

Prilikom usporedbe nizova treba se koristiti klasa niza, a ne izravna upotreba literala niza jer bi se uspoređivali pokazivači, a ne stvarni nizovi. Sljedeći kôd prikazuje kako se klasa niza koristi:

#uključi
red_prioriteta<niz>pq1;
niz s1=niz('olovka'), s2=niz('olovka'), s3=niz('vježbenica'), s4=niz('udžbenik'), s5=niz('vladar');

pq1.gurnuti(s1);pq1.gurnuti(s2);pq1.gurnuti(s3);pq1.gurnuti(s4);pq1.gurnuti(s5);
dok(!pq1.prazan())
{
trošak <<pq1.vrh() << '';
pq1.pop();
} trošak<<' n';

Izlaz je:

& emsp; udžbenik & emsp; ravnalo & emsp; olovka & emsp; olovka & emsp; vježbenica

Ostale konstrukcije redova prioriteta

Eksplicitno stvaranje iz vektora
Red prioriteta može se izričito stvoriti iz vektora kako pokazuje sljedeći kod:

#uključi
vektor<int>vtr= {10,30,dvadeset,pedeset,40};

red_prioriteta<int>pq(vtr.početi(), vtr.kraj());

dok(!pqprazan())
{
trošak <<pqvrh() << '';
pqpop();
} trošak<<' n';

Izlaz je: 50 40 30 20 10. Ovaj put se također mora uključiti zaglavlje vektora. Argumenti za funkciju konstruktora uzimaju početne i krajnje pokazivače vektora. Tip podataka za vektor i tip podataka za prioritetni red moraju biti isti.

Kako bi prioritet imao najmanju vrijednost, deklaracija za konstruktor bila bi:

red_prioriteta<int, vektor<int>, veći>int> >pq(vtr.početi(), vtr.kraj());

Eksplicitno stvaranje iz niza
Red prioriteta može se izričito stvoriti iz niza kako pokazuje sljedeći kod:

intdol[] = {10,30,dvadeset,pedeset,40};

red_prioriteta<int>pq(arr, arr+5);

dok(!pqprazan())
{
trošak <<pqvrh() << '';
pqpop();
} trošak<<' n';

Izlaz je: 50 40 30 20 10. Argumenti za funkciju konstruktora uzimaju početne i završne pokazivače niza. arr vraća početni pokazivač, arr+5 vraća pokazivač tik uz polje, a 5 je veličina niza. Tip podataka za niz i tip podataka za prioritetni red moraju biti isti.

Kako bi prioritet imao najmanju vrijednost, deklaracija za konstruktor bila bi:

red_prioriteta<int, vektor<int>, veći<int> >pq(arr, arr+5);

Napomena: U C ++, prioritetni red se zapravo naziva adaptorom, a ne samo spremnikom.

Prilagođeni kod za usporedbu

Sve vrijednosti u redu prioriteta uzlazno ili sve silazno nije jedina opcija za red prioriteta. Na primjer, popis od 11 cijelih brojeva za najveću hrpu je:

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

Najveća vrijednost je 88. Nakon toga slijede dva broja: 86 i 87, koji su manji od 88. Ostatak brojeva je manji od ova tri broja, ali zapravo nije u redu. Na popisu se nalaze dvije prazne ćelije. Brojevi 84 i 82 manji su od 86. Brojevi 79 i 74 manji su od 87. Brojevi 80 i 81 manji su od 84. Brojevi 64 i 69 manji su od 79.

Postavljanje brojeva slijedi kriterije najveće hrpe-pogledajte kasnije. Kako bi osigurao takvu shemu za prioritetni red, programer mora dati svoj vlastiti kod za usporedbu - vidi kasnije.

Zaključak

C ++ prioritetni_red je red prvi-u-prvi-izlaz. Funkcija člana, gurnuti(), dodaje novu vrijednost u red čekanja. Funkcija člana, vrh(), čita najveću vrijednost u redu čekanja. Funkcija člana, pop (), uklanja bez vraćanja najveće vrijednosti reda. Funkcija člana, prazan(), provjerava je li red prazan. Međutim, prioritetni_red se razlikuje od reda u tome što slijedi neki algoritam prioriteta. To može biti najveće, od prvog do posljednjeg, ili najmanje, od prvog do posljednjeg. Kriteriji (algoritam) također se mogu definirati programerima.