C ++

Kaip naudoti C ++ Priority_queue?

Kaip naudoti C ++ Priority_queue?
C ++ eilutė yra sąrašo duomenų struktūra, kur pirmasis į sąrašą įtrauktas elementas yra pirmasis pašalinamas elementas, kai turi būti pašalinta. C ++ eilės prioritetinė eilė yra panaši, tačiau turi tam tikrą eiliškumą; pirmiausia pašalinamas didžiausios vertės elementas. Prioritetinę eilę vis tiek galima sukonfigūruoti taip, kad pirmiausia būtų pašalintas mažiausiai vertės elementas. Bet kurioje eilėje turi būti bent stumti () funkcija ir pop () funkcija. The stumti () funkcija prideda naują elementą gale. Įprastai eilei, pop () funkcija pašalina pirmąjį kada nors įstumtą elementą. Dėl prioritetinės eilės pop () funkcija pašalina aukščiausią prioritetą turintį elementą, kuris gali būti didžiausias ar mažiausias, atsižvelgiant į užsakymo schemą.

Norint naudoti C ++ priority_queue, programa turėtų prasidėti tokiu kodu:

# įtraukti
# įtraukti
naudojant vardų sritį std;

Į programą įtraukiama eilių biblioteka.

Norėdamas toliau skaityti, skaitytojas turėjo turėti pagrindinių žinių apie C++.

Straipsnio turinys

  • Įvadas - žr. Aukščiau
  • Pagrindinė statyba
  • Svarbios narių funkcijos
  • Kitos prioritetinės eilės funkcijos
  • Styginių duomenys
  • Kitos prioritetinės eilės konstrukcijos
  • Išvada

Pagrindinė statyba

Duomenų struktūra turi būti sukonstruota pirmiausia, kad ją būtų galima naudoti. Konstrukcija čia reiškia objekto greitinimą iš bibliotekos eilių klasės. Tada eilės objekte turi būti programuotojo suteiktas vardas. Paprasčiausia sintaksė sukurti prioritetinę eilę yra:

prioriteto_prasmė queueName;

Taikant šią sintaksę, pirmiausia pašalinama didžiausia vertė. Akimirksnio pavyzdys yra:

prioriteto_spalva pq;

arba

prioriteto_prasmė pq;

Vektorius ir deque yra dvi duomenų struktūros C++. „Prior_queueue“ galima sukurti naudojant bet kurį iš jų. Sintaksė sukurti prioritetinę eilę iš vektoriaus struktūros yra:

prioriteto_spalva, palyginti> pq;

Šio pavyzdžio pavyzdys yra:

prioriteto_prasmė, mažiau > pq;

Deklaracijos pabaigoje atkreipkite dėmesį į atotrūkį tarp> ir>. Taip siekiama išvengti painiavos su >>. Numatytasis palyginimo kodas yra „mažiau“, Reiškiantis didžiausią ir nebūtinai pirmąją vertę, pirmiausia būtų pašalintas. Taigi, sukūrimo pareiškimą galima tiesiog parašyti taip:

prioriteto_prasmė > pq;

Jei pirmiausia reikia pašalinti mažiausią vertę, sakinys turi būti:

prioriteto_prasmė, didesnis > pq;

Svarbios narių funkcijos

„Push“ () funkcija
Ši funkcija įstumia reikšmę, kuri yra jos argumentas, į prioriteto reikšmę. Jis grįžta negaliojantis. Tai iliustruoja šis kodas:

prioriteto_prasmė pq;
pq.stumti (10);
pq.stumti (30);
pq.stumti (20);
pq.stumti (50);
pq.stumti (40);

Šiam prioriteto_skilui buvo suteiktos 5 sveikųjų skaičių vertės, esančios 10, 30, 20, 50, 40 eilės tvarka. Jei visi šie elementai bus pašalinti iš prioritetinės eilės, jie pasirodys 50, 40, 30, 20, 10 tvarka.

Pop () funkcija
Ši funkcija pašalina iš prioriteto nustatymo reikšmę, turinčią didžiausią prioritetą. Jei palyginimo kodas yra „didesnis“, Tada jis pašalins elementą, kurio vertė mažiausia. Jei paskambinsite dar kartą, jis pašalins kitą elementą, kurio likusi vertė bus mažiausia; paskambinus dar kartą, pašalinama kita mažiausia esama vertė ir pan. Jis grįžta negaliojantis. Tai iliustruoja šis kodas:

prioriteto_prasmė, didesnis > pq;
pq.stumti ('a'); pq.stumti („c“); pq.stumti ('b'); pq.stumti ('e'); pq.stumti ('d');

Atminkite, kad norint iškviesti nario funkciją, po objekto pavadinimo turi būti taškas, o paskui - funkcija.

Viršutinė () funkcija
The pop () funkcija pašalina kitą aukščiausio prioriteto vertę, tačiau jos negrąžina, kaip pop () yra niekinė funkcija. Naudoti viršuje () funkciją, kad sužinotumėte aukščiausią prioritetą, kurį reikia pašalinti vėliau. The viršuje () funkcija grąžina aukščiausio prioriteto reikšmės prioriteto eilėje kopiją. Tai iliustruoja toliau pateiktas kodas, kuriame kita didžiausio prioriteto reikšmė yra mažiausia

prioriteto_spalva, didesnis > pq;
pq.stumti ('a'); pq.stumti („c“); pq.stumti ('b'); pq.stumti ('e'); pq.stumti ('d');
char ch1 = pq.viršuje (); pq.popsas ();
char ch2 = pq.viršuje (); pq.popsas ();
char ch3 = pq.viršuje (); pq.popsas ();
char ch4 = pq.viršuje (); pq.popsas ();
char ch5 = pq.viršuje (); pq.popsas ();
cout<Išvestis yra "a" b "c" d "e".

Funkcija tuščia ()
Jei programuotojas naudoja viršuje () funkcija tuščiame prioriteto eilėje, po sėkmingo kompiliavimo, jis gaus klaidos pranešimą, pvz .:

Segmentavimo gedimas (šerdis išmestas)

Taigi, prieš naudodami, visada patikrinkite, ar prioritetinė eilė nėra tuščia viršuje () funkcija. The tuščia() member funkcija pateikia reikšmę true, jei eilė tuščia, ir false, jei eilė nėra tuščia. Tai iliustruoja šis kodas:

prioriteto_spalva pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.stumti (i1); pq.stumti (i2); pq.stumti (i3); pq.stumti (i4); pq.stumti (i5);
o (!pq.tuščia())

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

cout << '\n';

Kitos prioritetinės eilės funkcijos

Funkcija dydis ()
Ši funkcija grąžina prioritetinės eilės ilgį, kaip parodo šis kodas:

prioriteto_prasmė pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.stumti (i1); pq.stumti (i2); pq.stumti (i3); pq.stumti (i4); pq.stumti (i5);
int len ​​= pq.dydis ();
cout << len << '\n';

Išvestis yra 5.

Apsikeitimo () funkcija
Jei du prioriteto žymenys yra to paties tipo ir dydžio, tada ši funkcija gali juos pakeisti, kaip rodo šis kodas:

prioriteto_spalva pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.stumti (i1); pq1.stumti (i2); pq1.stumti (i3); pq1.stumti (i4); pq1.stumti (i5);
prioriteto_prasmė pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.stumti (it1); pqA.stumti (it2); pqA.stumti (it3); pqA.stumti (it4); pqA.stumti (it5);
pq1.apsikeitimas (pqA);
o (!pq1.tuščia())

cout << pq1.top() << ";
pq1.popsas ();
cout<<'\n';
o (!pqA.tuščia())

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

Rezultatas yra:

5 4 3 2 1
50 40 30 20 10

„Emplace“ () „Fuction“
The vieta () funkcija yra panaši į stūmimo funkciją. Tai iliustruoja šis kodas:

prioriteto_spalva pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.vieta (i1); pq1.vieta (i2); pq1.emplace (i3); pq1.vieta (i4); pq1.emplace (i5);
o (!pq1.tuščia())

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

Rezultatas yra:

50 40 30 20 10

Styginių duomenys

Lyginant eilutes, reikia naudoti eilutės klasę, o ne tiesiogiai naudoti eilutės literalus, nes ji palygintų rodykles, o ne tikras eilutes. Šis kodas rodo, kaip naudojama eilutės klasė:

# įtraukti
prioriteto_prasmė pq1;
eilutė s1 = eilutė ("rašiklis"), s2 = virvelė ("pieštukas"), s3 = eilutė ("pratybų sąsiuvinis"), s4 = eilutė ("vadovėlis"), s5 = eilutė ("valdovas");
pq1.stumti (s1); pq1.stumti (s2); pq1.stumti (s3); pq1.stumti (s4); pq1.stumti (s5);
o (!pq1.tuščia())

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

Rezultatas yra:

vadovėlių pieštuko tušinuko pratybų sąsiuvinis

Kitos prioritetinės eilės konstrukcijos

Aiškus kūrimas iš vektoriaus
Prioritetinę eilę galima sukurti aiškiai iš vektoriaus, kaip rodo šis kodas:

# įtraukti
vektorius vtr = 10, 30, 20, 50, 40;
prioriteto_spalva pq (vtr.pradėti (), vtr.galas());
o (!pq.tuščia())

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

Išvestis yra: 50 40 30 20 10. Šį kartą taip pat reikia įtraukti vektoriaus antraštę. Konstruktoriaus funkcijos argumentai apima vektoriaus pradžios ir pabaigos rodykles. Vektoriaus duomenų tipas ir prioriteto eilės duomenų tipas turi būti vienodi.

Norint kuo mažiau įvertinti prioritetą, konstruktoriaus deklaracija būtų:

prioriteto_prasmė, didesnis> int>> pq (vtr.pradėti (), vtr.galas());

Aiškus kūrinys iš masyvo
Pirmenybės eilę galima sukurti iš masyvo, kaip rodo šis kodas:

int arr [] = 10, 30, 20, 50, 40;
prioriteto_prasmė pq (arr, arr + 5);
o (!pq.tuščia())

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

Išvestis yra: 50 40 30 20 10. Konstruktoriaus funkcijos argumentai pateikia masyvo pradžios ir pabaigos rodykles. arr grąžina pradinį rodyklę, „arr + 5“ grąžina rodyklę tik už masyvo, o 5 yra masyvo dydis. Masyvo duomenų tipas ir prioriteto eilės duomenų tipas turi būti vienodi.

Norint kuo mažiau įvertinti prioritetą, konstruktoriaus deklaracija būtų:

prioriteto_prasmė, didesnis > pq (arr, arr + 5);

Pastaba: C ++ versijoje prioriteto_kodas yra vadinamas adapteriu, o ne tik konteineriu.

Pasirinktinis palyginimo kodas

Visų prioritetinėje eilėje esančių reikšmių didėjimas ar mažėjimas nėra vienintelis prioritetinės eilės variantas. Pvz., 11 sveikų skaičių, nurodančių maksimalų kaupą, sąrašas:

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

Didžiausia vertė yra 88. Po to seka du skaičiai: 86 ir 87, kurie yra mažiau nei 88. Likę skaičiai yra mažesni už šiuos tris skaičius, bet iš tikrųjų nėra tvarkingi. Sąraše yra dvi tuščios langelės. Skaičiai 84 ir 82 yra mažesni nei 86. Skaičiai 79 ir 74 yra mažesni nei 87. Skaičiai 80 ir 81 yra mažesni nei 84. Skaičiai 64 ir 69 yra mažesni nei 79.

Skaičių išdėstymas atitinka maksimalaus kriterijaus kriterijus - žr. Vėliau. Norėdamas pateikti tokią „prioriteto_markės“ schemą, programuotojas turi pateikti savo palyginimo kodą - žr. Vėliau.

Išvada

„C ++ priority_queue“ yra eilė „pirmas į pirmą“. Nario funkcija, stumti (), prideda naują vertę eilėje. Nario funkcija, viršuje (), nuskaito didžiausią eilės vertę. Nario funkcija, pop (), pašalina negrąžinant viršutinės eilės vertės. Nario funkcija, tuščia(), patikrina, ar eilė tuščia. Tačiau prioriteto eilė skiriasi nuo eilės, nes ji vadovaujasi tam tikru prioriteto algoritmu. Tai gali būti didžiausia, nuo pirmo iki paskutinio, arba mažiausiai, nuo pirmo iki paskutinio. Kriterijus (algoritmą) taip pat galima apibrėžti programuotoju.

„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...
Pelės kairiuoju pelės mygtuku mygtukas neveikia „Windows 10“
Jei naudojate specialią pelę su savo nešiojamuoju kompiuteriu arba staliniu kompiuteriu, tačiau neveikia pelės kairysis mygtukas dėl tam tikrų priežas...
Žymeklis peršoka arba juda atsitiktinai, kai rašote „Windows 10“
Jei pastebite, kad pelės žymeklis peršoka arba juda pats, automatiškai, atsitiktinai, kai vedate „Windows“ nešiojamąjį kompiuterį ar kompiuterį, kai k...