C ++

Kako se koristi C ++ Priority_queue?

Kako se koristi C ++ Priority_queue?
U C ++, red je struktura podataka popisa gdje je prvi element koji se stavlja na popis prvi element koji se uklanja kada se treba izvršiti uklanjanje. Prioritetni red u C ++-u je sličan, ali ima određeni redoslijed; prvo se uklanja element s najvećom vrijednošću. Prioritetni red i dalje se može konfigurirati tako da se prvo ukloni element s najmanje vrijednosti. Bilo koji red mora imati najmanje gurnuti() funkcija i pop () funkcija. The gurnuti() funkcija dodaje novi element straga. Za uobičajeni red, pop () funkcija uklanja prvi element koji je ikad gurnut. Za prioritetni red, pop () funkcija uklanja element s najvećim prioritetom, koji bi mogao biti najveći ili najmanji, ovisno o shemi naručivanja.

Da bi se koristio C ++ priority_queue, program treba započeti s kodom poput:

#include
#include
pomoću prostora imena std;

Uključuje biblioteku redova u program.

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

Sadržaj članka

  • Uvod - vidi gore
  • Osnovna konstrukcija
  • Važne funkcije člana
  • Ostale funkcije prioritetnog reda
  • Podaci o nizu
  • Ostale konstrukcije prioritetnog reda
  • Zaključak

Osnovna konstrukcija

Struktura podataka mora se prvo konstruirati prije nego što se može koristiti. Konstrukcija ovdje znači instanciranje objekta iz klase reda knjižnice. Objekt reda mora tada imati ime koje mu je dao programer. Najjednostavnija sintaksa za stvaranje prioriteta reda je:

prioritet_reda queueName;

Ovom sintaksom prvo se uklanja najveća vrijednost. Primjer instancije je:

prioritet_reda pq;

ili

prioritet_reda pq;

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

prioritet_reda, usporedi> pq;

Primjer ove instancije je:

prioritet_reda, manje > pq;

Primijetite jaz između> i> na kraju deklaracije. Ovo je kako bi se spriječila zabuna s >>. Zadani kod za usporedbu je „manje”, Što znači da će se prvo ukloniti najveća, a ne nužno i prva vrijednost. Dakle, izjava o stvaranju može se jednostavno napisati kao:

prioritet_reda > pq;

Ako se prvo želi ukloniti najmanja vrijednost, tada izjava mora biti:

prioritet_reda, veće > pq;

Važne funkcije člana

Funkcija push ()
Ova funkcija gura vrijednost, koja je njezin argument, u prioritet_reda. Vraća se praznim. Sljedeći kod to ilustrira:

prioritet_reda pq;
pq.guranje (10);
pq.guranje (30);
pq.guranje (20);
pq.guranje (50);
pq.guranje (40);

Ovaj je prioritet_reda primio 5 cijelih vrijednosti redoslijedom 10, 30, 20, 50, 40. Ako će se svi ti elementi iskočiti iz reda prioriteta, tada će se pojaviti redoslijedom 50, 40, 30, 20, 10.

Funkcija pop ()
Ova funkcija uklanja iz prioriteta_vrsta vrijednost s najvišim prioritetom. Ako je kod za usporedbu „veći”, Tada će 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 se praznim. Sljedeći kod to ilustrira:

prioritet_reda, veće > pq;
pq.push ('a'); pq.push ('c'); pq.push ('b'); pq.push ('e'); pq.push ('d');

Imajte na umu da da bi se pozvala funkcija člana, iza imena objekta mora slijediti točka, a zatim funkcija.

Vrh () funkcija
The pop () funkcija uklanja sljedeću vrijednost najvišeg prioriteta, ali je ne vraća, kao pop () je void funkcija. Koristiti vrh() funkcija kako bi se znala vrijednost najvišeg prioriteta koja se sljedeća mora ukloniti. The vrh() funkcija vraća kopiju vrijednosti najvišeg prioriteta u priority_queue. Sljedeći kod, gdje je sljedeća vrijednost najvišeg prioriteta najmanja vrijednost, to ilustrira

prioritet_reda, veće > pq;
pq.push ('a'); pq.push ('c'); pq.push ('b'); pq.push ('e'); pq.push ('d');
char ch1 = pq.vrh(); pq.pop ();
char ch2 = pq.vrh(); pq.pop ();
char ch3 = pq.vrh(); pq.pop ();
char ch4 = pq.vrh(); pq.pop ();
char ch5 = pq.vrh(); pq.pop ();
cout<Izlaz je "a" b "c" d "e '.

Funkcija empty ()
Ako programer koristi vrh() funkcije na praznom prioritetnom_redu, nakon uspješne kompilacije, primit će poruku o pogrešci kao što je:

Kvar segmentacije (jezgra bačena)

Dakle, uvijek provjerite nije li redoslijed prioriteta prazan prije upotrebe vrh() funkcija. The prazan() funkcija member vraća bool, true, ako je red prazan, i false ako red nije prazan. Sljedeći kod to ilustrira:

prioritet_reda pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.guranje (i1); pq.guranje (i2); pq.guranje (i3); pq.guranje (i4); pq.guranje (i5);
dok(!pq.prazan())

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

cout << '\n';

Ostale funkcije prioritetnog reda

Veličina () Funkcija
Ova funkcija vraća duljinu reda prioriteta, kao što slijedi kôd:

prioritet_reda pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.guranje (i1); pq.guranje (i2); pq.guranje (i3); pq.guranje (i4); pq.guranje (i5);
int len ​​= pq.veličina();
cout << len << '\n';

Izlaz je 5.

Funkcija zamjene ()
Ako su dva prioriteta_vrsta iste vrste i veličine, tada ih ova funkcija može zamijeniti, kao što pokazuje sljedeći kod:

prioritet_reda pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.guranje (i1); pq1.guranje (i2); pq1.guranje (i3); pq1.guranje (i4); pq1.guranje (i5);
prioritet_reda pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.pritisnuti (it1); pqA.gurnuti (it2); pqA.gurnuti (it3); pqA.guranje (it4); pqA.guranje (it5);
pq1.zamjena (pqA);
dok(!pq1.prazan())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
dok(!pqA.prazan())

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

Izlaz je:

5 4 3 2 1
50 40 30 20 10

Mjesto () Fukcija
The staviti na položaj() funkcija slična je funkciji potiskivanja. Sljedeći kod to ilustrira:

prioritet_reda pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.emplace (i1); pq1.mjesto (i2); pq1.emplace (i3); pq1.mjesto (i4); pq1.mjesto (i5);
dok(!pq1.prazan())

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

Izlaz je:

50 40 30 20 10

Podaci o nizu

Kada se uspoređuju nizovi, trebala bi se koristiti klasa stringa, a ne izravna upotreba literalnih nizova, jer bi se uspoređivali pokazivači, a ne stvarni nizovi. Sljedeći kod pokazuje kako se koristi klasa stringa:

#include
prioritet_reda pq1;
niz s1 = niz ("olovka"), s2 = niz ("olovka"), s3 = niz ("vježbenica"), s4 = niz ("udžbenik"), s5 = niz ("ravnalo");
pq1.guranje (s1); pq1.potisak (s2); pq1.guranje (s3); pq1.guranje (s4); pq1.guranje (s5);
dok(!pq1.prazan())

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

Izlaz je:

udžbenik vladar olovka olovka vježbenica

Ostale konstrukcije prioritetnog reda

Eksplicitno stvaranje iz vektora
Prioritetni red može se izričito stvoriti iz vektora kao što pokazuje sljedeći kod:

#include
vektor vtr = 10, 30, 20, 50, 40;
prioritet_reda pq (vtr.begin (), vtr.kraj());
dok(!pq.prazan())

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

Izlaz je: 50 40 30 20 10. Ovaj put mora biti uključeno i zaglavlje vektora. Argumenti za konstruktorsku funkciju uzimaju početni i krajnji pokazivač vektora. Vrsta podataka za vektor i vrsta podataka za prioritet_reda moraju biti iste.

Da bi se najmanja vrijednost imala kao prioritet, deklaracija za konstruktor bi bila:

prioritet_reda, veći> int>> pq (vtr.begin (), vtr.kraj());

Eksplicitna kreacija iz niza
Prioritetni red može se izričito stvoriti iz niza kao što pokazuje sljedeći kod:

int arr [] = 10, 30, 20, 50, 40;
prioritet_reda pq (arr, arr + 5);
dok(!pq.prazan())

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

Izlaz je: 50 40 30 20 10. Argumenti za konstruktorsku funkciju uzimaju početni i krajnji pokazivač niza. arr vraća početni pokazivač, “arr + 5” vraća pokazivač tik iza polja, a 5 je veličina polja. Tip podataka za niz i tip podataka za prioritet_reda moraju biti jednaki.

Da bi se najmanja vrijednost imala kao prioritet, deklaracija za konstruktor bi bila:

prioritet_reda, veće > pq (arr, arr + 5);

Napomena: U C ++-u prioritetni_red se zapravo naziva adapter, a ne samo spremnik.

Prilagođeni usporedni kod

Imati sve vrijednosti u prioritetnom redu uzlazno ili sve silazno nije jedina opcija za prioritetni red. Na primjer, popis od 11 cijelih brojeva za maksimalnu hrpu je:

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

Najviš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 redom. Na popisu su 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.

Raspored brojeva slijedi kriterije maks. Hrpe - pogledajte kasnije. Da bi pružio takvu shemu za prioritet_reda, programer mora osigurati vlastiti kôd za usporedbu - vidi kasnije.

Zaključak

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

Besplatni i otvoreni kodni pokretački programi za razvoj Linux igara
Ovaj će članak pokriti popis besplatnih i open source pokretačkih igara koje se mogu koristiti za razvoj 2D i 3D igara na Linuxu. Brojni su takvi moto...
Vodič za Shadow of the Tomb Raider za Linux
Shadow of the Tomb Raider dvanaesti je dodatak seriji Tomb Raider - franšizi u akcijsko-avanturističkoj igri koju je stvorio Eidos Montreal. I kritiča...
Kako pojačati FPS u Linuxu?
FPS je kratica Okviri u sekundi. Zadatak FPS-a je mjerenje broja sličica u reprodukcijama video zapisa ili igranim izvedbama. Jednostavnim riječima, b...