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
- Svarīgas dalībnieku funkcijas
- Citas prioritārās rindas funkcijas
- Stīgu dati
- Citas prioritāro rindu konstrukcijas
- Secinājums
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:
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:
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
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:
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ā:
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ā:
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:
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ļautpriority_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ā:
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ā:
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.