Kā lietot C ++ Priority_queue?

How Use C Priority_queue



C ++ rindā ir saraksta datu struktūra, kurā pirmais elements, kas jāievieto sarakstā, ir pirmais elements, kas jānoņem, kad notiek noņemšana. Prioritāra rinda C ++ ir līdzīga, taču tai ir noteikta kārtī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 spiest () funkcija un pop () funkciju. The spiest () funkcija pievieno jaunu elementu aizmugurē. Parastajai rindai, pop () funkcija noņem pirmo iebīdīto elementu. Prioritātes rindai pop () funkcija noņem elementu ar visaugstāko prioritāti, kas var būt lielākā vai mazākā atkarībā no pasūtīšanas shēmas.

Lai izmantotu rindu C ++ prioritāte, programmai jāsākas ar šādu kodu:







#iekļaut
#iekļaut
izmantojot vārda telpastundas;

Programmā ir iekļauta rindu bibliotēka.



Lai turpinātu lasīt, lasītājam vajadzēja būt pamatzināšanām par C ++.



Raksta saturs

Pamata konstrukcija

Datu struktūra vispirms ir jāizveido, pirms to var izmantot. Būvniecība šeit nozīmē objekta parauga izveidošanu no bibliotēkas rindas klases. Rindas objektam pēc tam jābūt programmētāja piešķirtam nosaukumam. Vienkāršākā sintakse, lai izveidotu prioritāro rindu, ir šāda:





priority_queue<tipa>queueName;

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

priority_queue<int>pq;

vai



priority_queue<char>pq;

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

priority_queue<tips, vektors<viens un tas pats tips>, salīdzināt>pq;

Šīs atveidošanas piemērs ir šāds:

priority_queue<int, vektors<int>, mazāk<int> >pq;

Ievērojiet plaisu starp> un> deklarācijas beigās. Tas ir paredzēts, lai novērstu neskaidrības ar >>. Noklusējuma salīdzināšanas kods ir mazāks, un tas nozīmē, ka vispirms tiks noņemta lielākā un ne vienmēr pirmā vērtība. Tātad izveides paziņojumu var vienkārši uzrakstīt šādi:

priority_queue<int, vektors<int> >pq;

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

priority_queue<int, vektors<int>, lielāks<int> >pq;

Svarīgas dalībnieku funkcijas

Funkcija push ()
Šī funkcija izvirza vērtību, kas ir tās arguments, prioritātes_rindā. Tas atgriežas tukšumā. To ilustrē šāds kods:

priority_queue<int>pq;

pq.spiest(10);
pq.spiest(30);
pq.spiest(divdesmit);
pq.spiest(piecdesmit);
pq.spiest(40);

Šī prioritātes_rinda ir saņēmusi 5 veselu skaitļu vērtības 10, 30, 20, 50, 40. Ja visi šie elementi tiks izlaisti no prioritārās rindas, tad tie parādīsies 50, 40, 30, 20, 10.

Pop () funkcija
Šī funkcija no prioritātes_rindas noņem vērtību ar visaugstāko prioritāti. Ja salīdzināšanas kods ir lielāks, tas noņems elementu ar mazāko vērtību. Ja tiek izsaukts vēlreiz, tas noņem nākamo elementu ar mazāko pārējo vērtību; zvanot vēlreiz, tiek noņemta nākamā mazākā esošā vērtība utt. Tas atgriežas tukšumā. To ilustrē šāds kods:

priority_queue<char, vektors<char>, lielāks<int> >pq;
pq.spiest('uz');pq.spiest('c');pq.spiest('b');pq.spiest('Un');pq.spiest('d');

Ņemiet vērā: 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 neatgriež to kā pop () ir tukša funkcija. Izmantojiet tops() funkciju, lai uzzinātu augstākās prioritātes vērtību, kas nākamreiz ir jānoņem. The tops() funkcija atgriež augstākās prioritātes vērtības kopiju prioritātes_rindā. To ilustrē šāds kods, kur nākamā augstākās prioritātes vērtība ir mazākā vērtība

priority_queue<char, vektors<char>, lielāks<int> >pq;
pq.spiest('uz');pq.spiest('c');pq.spiest('b');pq.spiest('Un');pq.spiest('d');
charch1=pq.tops();pq.pops();
charch2=pq.tops();pq.pops();
charch3=pq.tops();pq.pops();
charch4=pq.tops();pq.pops();
charch5=pq.tops();pq.pops();

izmaksas<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<' n';

Rezultāts ir 'a' 'b' 'c' 'd' 'e'.

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

Segmentācijas kļūda(kodols izmests)

Tāpēc vienmēr pārbaudiet, vai prioritātes rinda nav tukša, pirms lietojat tops() funkciju. The tukšs () Funkcija dalībnieks atgriež bool, true, ja rinda ir tukša, un false, ja rinda nav tukša. To ilustrē šāds kods:

priority_queue<int>pq;
inti1= 10; inti2= 30; inti3= divdesmit; inti4= piecdesmit; inti5= 40;
pq.spiest(i1);pq.spiest(i2);pq.spiest(i3);pq.spiest(i4);pq.spiest(i5);

kamēr(!pq.tukšs())
{
izmaksas <<pq.tops() << '';
pq.pops();
}
izmaksas << ' n';

Citas prioritārās rindas funkcijas

Funkcija lielums ()
Šī funkcija atgriež prioritārās rindas garumu, kā parādīts šādā kodā:

priority_queue<int>pq;
inti1= 10; inti2= 30; inti3= divdesmit; inti4= piecdesmit; inti5= 40;
pq.spiest(i1);pq.spiest(i2);pq.spiest(i3);pq.spiest(i4);pq.spiest(i5);

intlen=pq.Izmērs();
izmaksas <<len<< ' n';

Izeja ir 5.

Swap () funkcija
Ja divas prioritātes_rindas ir viena veida un izmēra, šī funkcija var tās nomainīt, kā redzams šādā kodā:

priority_queue<int>pq1;
inti1= 10; inti2= 30; inti3= divdesmit; inti4= piecdesmit; inti5= 40;
pq1.spiest(i1);pq1.spiest(i2);pq1.spiest(i3);pq1.spiest(i4);pq1.spiest(i5);

priority_queue<int>pqA;
inttas 1= 1; inttas2= 3; inttas 3= 2; inttas4= 5; intit5= 4;
pqA.spiest(tas 1);pqA.spiest(tas2);pqA.spiest(tas 3);pqA.spiest(tas4);pqA.spiest(it5);

pq1.apmainīt(pqA);

kamēr(!pq1.tukšs())
{
izmaksas <<pq1.tops() << '';
pq1.pops();
} izmaksas<<' n';

kamēr(!pqA.tukšs())
{
izmaksas <<pqA.tops() << '';
pqA.pops();
} izmaksas<<' n';

Rezultāts ir šāds:

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

Emplace () Fuction
The ielikt () funkcija ir līdzīga push funkcijai. To ilustrē šāds kods:

priority_queue<int>pq1;
inti1= 10; inti2= 30; inti3= divdesmit; inti4= piecdesmit; inti5= 40;
pq1.ievietot(i1);pq1.ievietot(i2);pq1.ievietot(i3);pq1.ievietot(i4);pq1.ievietot(i5);

kamēr(!pq1.tukšs())
{
izmaksas <<pq1.tops() << '';
pq1.pops();
} izmaksas<<' n';

Rezultāts ir šāds:

50 40 30 20 10

Stīgu dati

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

#iekļaut
priority_queue<virkne>pq1;
virkne s1=virkne('pildspalva'), s2=virkne('zīmulis'), s3=virkne('uzdevumu grāmata'), s4=virkne('mācību grāmata'), s5=virkne('lineāls');

pq1.spiest(s1);pq1.spiest(s2);pq1.spiest(s3);pq1.spiest(s4);pq1.spiest(s5);
kamēr(!pq1.tukšs())
{
izmaksas <<pq1.tops() << '';
pq1.pops();
} izmaksas<<' n';

Rezultāts ir šāds:

& emsp; mācību grāmata & line; lineāls & emsp; zīmulis & pildspalva & emsp; uzdevumu grāmata

Citas prioritāro rindu konstrukcijas

Skaidra radīšana no vektora
Prioritātes rindu var skaidri izveidot no vektora, kā redzams šādā kodā:

#iekļaut
vektors<int>vtr= {10,30,divdesmit,piecdesmit,40};

priority_queue<int>pq(vtr.sākt(), vtr.beigas());

kamēr(!pq.tukšs())
{
izmaksas <<pq.tops() << '';
pq.pops();
} izmaksas<<' n';

Rezultāts ir: 50 40 30 20 10. Šoreiz ir 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 ir jābūt vienādiem.

Lai mazāko vērtību padarītu par prioritāti, konstruktora deklarācija būtu šāda:

priority_queue<int, vektors<int>, lielāks>int> >pq(vtr.sākt(), vtr.beigas());

Skaidra radīšana no masīva
Prioritāro rindu var skaidri izveidot no masīva, kā parādīts šādā kodā:

intarr[] = {10,30,divdesmit,piecdesmit,40};

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

kamēr(!pq.tukšs())
{
izmaksas <<pq.tops() << '';
pq.pops();
} izmaksas<<' 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 aiz masīva, un 5 ir masīva lielums. Masīva datu tipam un prioritātes_rindas datu tipam ir jābūt vienādiem.

Lai mazāko vērtību padarītu par prioritāti, konstruktora deklarācija būtu šāda:

priority_queue<int, vektors<int>, lielāks<int> >pq(arr, arr+5);

Piezīme. C ++ prioritātes_rindu faktiski sauc par adapteri, nevis tikai par konteineru.

Pielāgots salīdzināšanas kods

Ja visas prioritārās rindas vērtības ir augošas vai visas dilstošas, nav vienīgā prioritārās rindas iespēja. Piemēram, saraksts ar 11 veseliem skaitļiem maksimālajai kaudzei ir šāds:

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

Augstākā vērtība ir 88. 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 nav īsti 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.

Ciparu izvietojums atbilst maksimālās kaudzes kritērijiem-skatīt vēlāk. Lai nodrošinātu šādu shēmu prioritātes_rindai, programmētājam ir jānorāda savs salīdzināšanas kods - skatīt vēlāk.

Secinājums

C ++ prioritātes_rinda ir pirmā rindā pirmā. Dalībnieka funkcija, spiediet (), pievieno jaunu vērtību rindai. Dalībnieka funkcija, tops(), nolasa rindas augstāko 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 ir tukša. Tomēr prioritātes_rinda atšķiras no rindas ar to, ka tā ievēro kādu prioritātes algoritmu. Tas var būt vislielākais - no pirmā līdz pēdējam vai vismaz - no pirmā līdz pēdējam. Kritērijus (algoritmu) var definēt arī programmētājs.