C ++

Kā lietot C ++ Priority_queue?

Kā lietot C ++ Priority_queue?
C ++ rinda ir saraksta datu struktūra, kurā pirmais sarakstā ievietojamais elements ir pirmais noņemamais elements, kad jānotiek noņemšanai. Prioritārā rinda C ++ ir līdzīga, taču tajā ir noteikta secība; vispirms tiek noņemts elements ar vislielāko vērtību. Prioritātes rindu joprojām var konfigurēt tā, lai vispirms tiktu noņemts elements ar vismazāko vērtību. Jebkurā rindā jābūt vismaz virzīt () funkcija un pop () funkciju. The virzīt () funkcija pievieno jaunu elementu aizmugurē. Parastajai rindai pop () funkcija noņem pirmo elementu, kas jebkad ir iestumts. Prioritārajai rindai pop () funkcija noņem elementu ar visaugstāko prioritāti, kas varētu būt lielākais vai mazākais, atkarībā no pasūtīšanas shēmas.

Lai izmantotu C ++ priority_queue, programmai jāsākas ar kodu, piemēram:

# iekļaut
# iekļaut
izmantojot nosaukumvietu std;

Tas programmā iekļauj rindu bibliotēku.

Lai turpinātu lasīt, lasītājam bija jābūt pamatzināšanām par C++.

Raksta saturs

  • Ievads - skatīt iepriekš
  • Pamata konstrukcija
  • Svarīgas locekļa funkcijas
  • Citas prioritārās rindas funkcijas
  • Stīgu dati
  • Citas prioritārās rindas konstrukcijas
  • Secinājums

Pamata konstrukcija

Pirms to var izmantot, vispirms jākonstruē datu struktūra. Konstrukcija šeit nozīmē objekta iegūšanu no bibliotēkas rindas klases. Pēc tam rindas objektam jābūt nosaukumam, ko tam piešķīris programmētājs. Vienkāršākā sintakse prioritārās rindas izveidošanai ir:

prioritātes_mērķis queueName;

Izmantojot šo sintaksi, vispirms tiek noņemta lielākā vērtība. Instantācijas piemērs ir:

prioritātes_mērķis pq;

vai

prioritātes_mērķis pq;

Vektors un deque ir divas datu struktūras C++. Prioritātes_rindu var izveidot ar kādu no tiem. Sintakse, lai izveidotu prioritāru rindu no vektoru struktūras, ir šāda:

prioritātes_mērķis, salīdzināt> pq;

Šīs piemērs ir:

prioritātes_mērķis, mazāk > pq;

Deklarācijas beigās ievērojiet plaisu starp> un>. Tas ir paredzēts, lai novērstu sajaukšanu ar >>. Noklusējuma salīdzināšanas kods ir “mazāk”, Kas nozīmē lielāko un ne vienmēr pirmo vērtību, vispirms noņemtu. Tātad izveidošanas paziņojumu var vienkārši uzrakstīt šādi:

prioritātes_mērķis > pq;

Ja vispirms ir jānoņem vismazākā vērtība, paziņojumam jābūt:

prioritātes_mērķis, lielāks > pq;

Svarīgas locekļa funkcijas

Funkcija push ()
Šī funkcija iestumj vērtību, kas ir tās arguments, prioritāšu_rindā. Tas atgriežas anulēts. Šis kods ilustrē to:

prioritātes_mērķis pq;
pq.grūdiens (10);
pq.grūdiens (30);
pq.grūdiens (20);
pq.grūdiens (50);
pq.grūdiens (40);

Šī prioritārā_rindiņa ir saņēmusi 5 veselu skaitļu vērtības secībā 10, 30, 20, 50, 40. Ja visus šos elementus paredzēts izlaist no prioritārās rindas, tie iznāks 50, 40, 30, 20, 10 secībā.

Funkcija Pop ()
Šī funkcija no prioritātes_klases noņem vērtību ar visaugstāko prioritāti. Ja salīdzināšanas kods ir “lielāks”, Tad tas noņems elementu ar mazāko vērtību. Ja zvana vēlreiz, tas noņem nākamo elementu ar vismazāko pārējo vērtību; izsaukta vēlreiz, tā noņem nākamo mazāko esošo vērtību utt. Tas atgriežas anulēts. Šis kods ilustrē to:

prioritātes_mērķis, lielāks > pq;
pq.grūdiens ('a'); pq.grūdiens ('c'); pq.grūdiens ('b'); pq.grūdiens ('e'); pq.grūdiens ('d');

Ņemiet vērā, ka, lai izsauktu dalībnieka funkciju, objekta nosaukumam jāseko punktam un pēc tam funkcijai.

Augšējā () funkcija
The pop () funkcija noņem nākamo augstākās prioritātes vērtību, bet to neatgriež, kā pop () ir tukšuma funkcija. Izmantojiet tops() funkciju, lai uzzinātu augstākās prioritātes vērtību, kas jānoņem pēc tam. The tops() funkcija atgriež prioritātes vērtības augstākās prioritātes vērtības kopiju. To ilustrē šāds kods, kur nākamā augstākās prioritātes vērtība ir mazākā

prioritātes_mērķis, lielāks > pq;
pq.grūdiens ('a'); pq.grūdiens ('c'); pq.grūdiens ('b'); pq.grūdiens ('e'); pq.grūdiens ('d');
char ch1 = pq.tops(); pq.pops ();
char ch2 = pq.tops(); pq.pops ();
char ch3 = pq.tops(); pq.pops ();
char ch4 = pq.tops(); pq.pops ();
char ch5 = pq.tops(); pq.pops ();
cout<Rezultāts ir "a" b "c" d "e".

Tukšā () funkcija
Ja programmētājs izmanto tops() Funkcija tukšā prioritātes_rindā pēc veiksmīgas apkopošanas viņš saņems tādu kļūdas ziņojumu kā:

Segmentācijas kļūda (kodols izgāzts)

Tātad, pirms lietojat, vienmēr pārbaudiet, vai prioritārā rinda nav tukša tops() funkciju. The tukšs () member funkcija atgriež bool vērtību true, ja rinda ir tukša, un false, ja rinda nav tukša. Šis kods ilustrē to:

prioritātes_mērķis pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.grūdiens (i1); pq.grūdiens (i2); pq.grūdiens (i3); pq.grūdiens (i4); pq.grūdiens (i5);
kamēr (!pq.tukšs ())

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

cout << '\n';

Citas prioritārās rindas funkcijas

Izmērs () Funkcija
Šī funkcija atgriež prioritārās rindas garumu, kā parāda šāds kods:

prioritātes_mērķis pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.grūdiens (i1); pq.grūdiens (i2); pq.grūdiens (i3); pq.grūdiens (i4); pq.grūdiens (i5);
int len ​​= pq.Izmērs();
cout << len << '\n';

Rezultāts ir 5.

Mijmaiņas () funkcija
Ja divām prioritārajām rindiņām ir tāda paša veida un lieluma, tad ar šo funkciju tās var apmainīt, kā parāda šāds kods:

prioritātes_mērķis pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.grūdiens (i1); pq1.grūdiens (i2); pq1.grūdiens (i3); pq1.grūdiens (i4); pq1.grūdiens (i5);
prioritātes_mērķis pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.virzīt (it1); pqA.grūdiens (it2); pqA.grūdiens (it3); pqA.grūst (it4); pqA.grūdiens (it5);
pq1.mijmaiņa (pqA);
kamēr (!pq1.tukšs ())

cout << pq1.top() << ";
pq1.pops ();
cout<<'\n';
kamēr (!pqA.tukšs ())

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

Rezultāts ir:

5 4 3 2 1
50 40 30 20 10

Emplace () Fuction
The emplace () funkcija ir līdzīga stumšanas funkcijai. Šis kods ilustrē to:

prioritātes_mērķis 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);
kamēr (!pq1.tukšs ())

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

Rezultāts ir:

50 40 30 20 10

Stīgu dati

Salīdzinot virknes, jāizmanto virkņu klase, nevis tieša virknes literāļu izmantošana, jo tā salīdzinātu rādītājus, nevis faktiskās virknes. Šis kods parāda, kā tiek izmantota virknes klase:

# iekļaut
prioritātes_mērķis pq1;
virkne s1 = virkne ("pildspalva"), s2 = virkne ("zīmulis"), s3 = virkne ("vingrinājumu grāmata"), s4 = virkne ("mācību grāmata"), s5 = virkne ("lineāls");
pq1.grūdiens (s1); pq1.grūdiens (s2); pq1.grūdiens (s3); pq1.grūdiens (s4); pq1.grūdiens (s5);
kamēr (!pq1.tukšs ())

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

Rezultāts ir:

mācību grāmatu lineāls zīmuļa pildspalva uzdevumu grāmata

Citas prioritārās rindas konstrukcijas

Nepārprotama izveide no vektora
Prioritātes rindu var tieši izveidot no vektora, kā parāda šāds kods:

# iekļaut
vektors vtr = 10, 30, 20, 50, 40;
prioritātes_mērķis pq (vtr.sākt (), vtr.beigas ());
kamēr (!pq.tukšs ())

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

Rezultāts ir: 50 40 30 20 10. Šoreiz jāiekļauj arī vektora galvene. Konstruktora funkcijas argumenti ņem vektora sākuma un beigu rādītājus. Vektora datu tipam un prioritātes_rindas datu tipam jābūt vienādam.

Lai prioritātei piešķirtu vismazāko vērtību, deklarācija konstruktoram būtu šāda:

prioritātes_mērķis, lielāks> int>> pq (vtr.sākt (), vtr.beigas ());

Skaidra izveide no masīva
Prioritātes rindu var izveidot tieši no masīva, kā parāda šāds kods:

int arr [] = 10, 30, 20, 50, 40;
prioritātes_mērķis pq (arr, arr + 5);
kamēr (!pq.tukšs ())

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

Rezultāts ir: 50 40 30 20 10. Konstruktora funkcijas argumenti ņem masīva sākuma un beigu rādītājus. arr atgriež sākuma rādītāju, “arr + 5” atgriež rādītāju tieši gar masīvu, un 5 ir masīva lielums. Masīva datu tipam un prioritātes_rindas datu tipam jābūt vienādam.

Lai prioritātei piešķirtu vismazāko vērtību, deklarācija konstruktoram būtu šāda:

prioritātes_mērķis, lielāks > pq (arr, arr + 5);

Piezīme: Programmā C ++ prioritāšu_rindu faktiski sauc par adapteri, ne tikai par konteineru.

Pielāgots salīdzināšanas kods

Ja visām prioritārā rindā esošajām vērtībām ir augšupejoša vai lejupejoša vērtība, tā nav vienīgā prioritārās rindas iespēja. Piemēram, 11 veselu skaitļu saraksts ar maksimālo kaudzi ir:

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

Augstākā vērtība ir 88. Pēc tam seko divi skaitļi: 86 un 87, kas ir mazāki par 88. Pārējie skaitļi ir mazāki par šiem trim skaitļiem, bet patiesībā nav kārtībā. Sarakstā ir divas tukšas šūnas. Skaitļi 84 un 82 ir mazāki par 86. Skaitļi 79 un 74 ir mazāki par 87. Skaitļi 80 un 81 ir mazāki par 84. Skaitļi 64 un 69 ir mazāki par 79.

Skaitļu izvietojums atbilst maksimālās kaudzes kritērijiem - skatiet vēlāk. Lai nodrošinātu šādu shēmu prioritātes_klasēm, programmētājam ir jāsniedz savs salīdzināšanas kods - skatiet vēlāk.

Secinājums

C ++ priority_queue ir rinda “pirmais iekšā pirmais”. Dalībnieka funkcija, virzīt (), pievieno jaunu vērtību rindā. Dalībnieka funkcija, tops(), nolasa rindas augšējo vērtību. Dalībnieka funkcija, pop (), noņem, neatgriežot rindas augšējo vērtību. Dalībnieka funkcija, tukšs (), pārbauda, ​​vai rinda nav tukša. Tomēr prioritārā_rindas rinda atšķiras no rindas, jo tā seko kādam prioritātes algoritmam. Tas var būt vislielākais, no pirmā līdz pēdējam vai vismazāk no pirmā līdz pēdējam. Kritērijus (algoritmu) var definēt arī programmētājs.

5 labākās arkādes spēles Linux
Mūsdienās datori ir nopietnas mašīnas, kuras izmanto spēlēšanai. Ja jūs nevarat iegūt jauno augsto rezultātu, jūs zināt, ko es domāju. Šajā ierakstā j...
Cīņa par Vesnotu 1.13.6 Izlaista attīstība
Cīņa par Vesnotu 1.13.6 izlaists pagājušajā mēnesī, ir sestais izstrādes izlaidums 1.13.x sērija un tā nodrošina vairākus uzlabojumus, īpaši lietotāja...
Kā instalēt League of Legends operētājsistēmā Ubuntu 14.04
Ja jūs esat League of Legends fans, tad šī ir iespēja jums izmēģināt League of Legends. Ņemiet vērā, ka LOL tiek atbalstīts PlayOnLinux, ja esat Linux...