C ++

Kuidas kasutada funktsiooni C ++ Priority_queue?

Kuidas kasutada funktsiooni C ++ Priority_queue?
C ++ keeles on järjekord loendi andmestruktuur, kus loendisse esimene element on esimene eemaldatav element, kui eemaldamine toimub. C ++ prioriteetne järjekord on sarnane, kuid sellel on teatud järjestus; kõigepealt eemaldatakse kõige suurema väärtusega element. Prioriteedijärjekorda saab endiselt konfigureerida nii, et kõigepealt eemaldatakse kõige vähem väärtusega element. Igas järjekorras peab olema vähemalt suruma () funktsioon ja pop () funktsioon. The suruma () funktsioon lisab tagaküljele uue elemendi. Tavalise järjekorra jaoks on pop () funktsioon eemaldab esimese kunagi sisse lükatud elemendi. Prioriteetse järjekorra jaoks pop () funktsioon eemaldab kõrgeima prioriteediga elemendi, mis võib olla kõige suurem või väiksem, sõltuvalt tellimisskeemist.

C ++ priority_queue'i kasutamiseks peaks programm algama koodiga nagu:

# kaasata
# kaasata
nimeruumi kasutamine std;

See sisaldab programmi järjekorrateeki.

Lugemise jätkamiseks pidanuks lugejal olema algteadmised C-st++.

Artikli sisu

  • Sissejuhatus - vt eespool
  • Põhiline ehitus
  • Olulised liikme funktsioonid
  • Muud prioriteetse järjekorra funktsioonid
  • Stringandmed
  • Muud prioriteetsete järjekordade ehitused
  • Järeldus

Põhiline ehitus

Enne selle kasutamist tuleb andmestruktuur koostada. Ehitamine tähendab siin objekti kiirendamist raamatukogu järjekorra klassist. Järjekorraobjektil peab siis olema programmeerija antud nimi. Prioriteedijärjekorra loomiseks on kõige lihtsam süntaks:

prioriteetsus queueName;

Selle süntaksiga eemaldatakse kõigepealt suurim väärtus. Instantsimise näide on:

prioriteetsus pq;

või

prioriteetsus pq;

Vektor ja deque on C-s kaks andmestruktuuri++. Mõlemaga neist saab luua prioriteedimärgi. Vektorstruktuurist prioriteetse järjekorra loomiseks on süntaks järgmine:

prioriteetsus, võrrelda> pq;

Selle kiirendamise näide on:

prioriteetsus, vähem > pq;

Pange tähele deklaratsiooni lõpus olevat lõhet> ja> vahel. Selle eesmärk on vältida segiajamist >> -ga. Vaikimisi on võrdluskood “vähem”, Mis tähendab suurimat ja mitte tingimata esimest väärtust, eemaldataks kõigepealt. Niisiis, loomisavalduse saab lihtsalt kirjutada järgmiselt:

prioriteetsus > pq;

Kui kõigepealt tuleb eemaldada vähim väärtus, peab lause olema järgmine:

prioriteetsus, suurem > pq;

Olulised liikme funktsioonid

Funktsioon push ()
See funktsioon lükkab väärtuse, mis on selle argument, prioriteedimärki. See naaseb tühiseks. Järgmine kood illustreerib seda:

prioriteetsus pq;
pq.surumine (10);
pq.surumine (30);
pq.surumine (20);
pq.surumine (50);
pq.surumine (40);

Sellele prioriteedimärgile on antud 5 täisarvu suuruses 10, 30, 20, 50, 40. Kui kõik need elemendid soovitakse prioriteetsest järjekorrast välja hüpata, tulevad need välja järjekorras 50, 40, 30, 20, 10.

Funktsioon Pop ()
See funktsioon eemaldab prioriteedi väärtusest kõrgeima prioriteediga väärtuse. Kui võrdluskood on „suurem”, Siis eemaldab see kõige väiksema väärtusega elemendi. Kui seda uuesti kutsutakse, eemaldab see järgmise elemendi, mille väärtus on kõige väiksem; uuesti helistatud, eemaldab see järgmise väikseima olemasoleva väärtuse jne. See naaseb tühiseks. Järgmine kood illustreerib seda:

prioriteetsus, suurem > pq;
pq.suruma ('a'); pq.surumine ('c'); pq.surumine ('b'); pq.surumine ('e'); pq.suruma ('d');

Pange tähele, et liikmefunktsiooni kutsumiseks peab objekti nimele järgnema punkt ja seejärel funktsioon.

Ülemine funktsioon ()
The pop () funktsioon eemaldab järgmise kõrgeima prioriteediga väärtuse, kuid ei tagasta seda nagu pop () on tühine funktsioon. Kasuta üles () funktsioon, et teada saada järgmise prioriteedi kõrgeima prioriteedi väärtust. The üles () funktsioon tagastab prioriteedimärgi kõrgeima prioriteedi väärtuse koopia. Järgmine kood, kus järgmine kõrgeima prioriteediga väärtus on väikseim, illustreerib seda

prioriteetsus, suurem > pq;
pq.suruma ('a'); pq.surumine ('c'); pq.surumine ('b'); pq.surumine ('e'); pq.suruma ('d');
char ch1 = pq.ülemine (); pq.pop ();
char ch2 = pq.ülemine (); pq.pop ();
char ch3 = pq.ülemine (); pq.pop ();
char ch4 = pq.ülemine (); pq.pop ();
char ch5 = pq.ülemine (); pq.pop ();
cout<Väljundiks on 'a "b" c "d" e ".

Funktsioon tühi ()
Kui programmeerija kasutab üles () funktsioon tühjal prioriteedimärgil, pärast edukat kompileerimist, kuvatakse talle tõrketeade, näiteks:

Segmenteerimisviga (tuum on dumpitud)

Nii et kontrollige enne, kui kasutate alati prioriteetset järjekorda üles () funktsioon. The tühi() member function tagastab looga true, kui järjekord on tühi, ja false, kui järjekord pole tühi. Järgmine kood illustreerib seda:

prioriteetsus pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.surumine (i1); pq.surumine (i2); pq.surumine (i3); pq.surumine (i4); pq.surumine (i5);
samas (!pq.tühi())

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

cout << '\n';

Muud prioriteetse järjekorra funktsioonid

Suurus () Funktsioon
See funktsioon tagastab prioriteedijärjekorra pikkuse, nagu illustreerib järgmine kood:

prioriteetsus pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.surumine (i1); pq.surumine (i2); pq.surumine (i3); pq.surumine (i4); pq.surumine (i5);
int len ​​= pq.suurus ();
cout << len << '\n';

Väljund on 5.

Funktsioon swap ()
Kui kaks prioriteedimärki on sama tüüpi ja suurusega, saab selle funktsiooniga neid vahetada, nagu näitab järgmine kood:

prioriteetsus pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.surumine (i1); pq1.surumine (i2); pq1.surumine (i3); pq1.surumine (i4); pq1.surumine (i5);
prioriteetsus pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.suruma (it1); pqA.suruma (it2); pqA.suruma (it3); pqA.suruma (it4); pqA.suruma (it5);
pq1.vahetada (pqA);
samas (!pq1.tühi())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
samas (!pqA.tühi())

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

Väljund on:

5 4 3 2 1
50 40 30 20 10

Emplace () Fuction
The asuma () funktsioon on sarnane tõukefunktsiooniga. Järgmine kood illustreerib seda:

prioriteetsus pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.töökoht (i1); pq1.töökoht (i2); pq1.töökoht (i3); pq1.töökoht (i4); pq1.töökoht (i5);
samas (!pq1.tühi())

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

Väljund on:

50 40 30 20 10

Stringandmed

Stringide võrdlemisel tuleks kasutada stringiklassi, mitte stringi literaalide otsest kasutamist, sest see võrdleks kursoreid, mitte tegelikke stringe. Järgmine kood näitab, kuidas stringiklassi kasutatakse:

# kaasata
prioriteetsus pq1;
string s1 = string ("pastakas"), s2 = string ("pliiats"), s3 = string ("vihik"), s4 = string ("õpik"), s5 = string ("joonlaud");
pq1.surumine (s1); pq1.surumine (s2); pq1.surumine (s3); pq1.surumine (s4); pq1.surumine (s5);
samas (!pq1.tühi())

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

Väljund on:

õpikute joonlaud pliiatspliiatsi harjutusraamat

Muud prioriteetsete järjekordade ehitused

Selgesõnaline loomine vektorist
Prioriteedijärjekorra saab selgesõnaliselt luua vektorist, nagu näitab järgmine kood:

# kaasata
vektor vtr = 10, 30, 20, 50, 40;
prioriteetsus pq (vtr.algama (), vtr.lõpp());
samas (!pq.tühi())

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

Väljund on: 50 40 30 20 10. Seekord tuleb lisada ka vektori päis. Konstruktori funktsiooni argumendid võtavad vektori algus- ja lõppnäpud. Vektori andmetüüp ja prioriteedimärgi andmetüüp peavad olema ühesugused.

Prioriteedi kõige vähem väärtustamiseks oleks konstruktori deklaratsioon järgmine:

prioriteetsus, suurem> int>> pq (vtr.algama (), vtr.lõpp());

Selgesõnaline loomine massiivist
Prioriteedijärjekorra saab luua massiivist selgesõnaliselt, nagu näitab järgmine kood:

int arr [] = 10, 30, 20, 50, 40;
prioriteetsus pq (arr, arr + 5);
samas (!pq.tühi())

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

Väljund on: 50 40 30 20 10. Konstruktori funktsiooni argumendid võtavad massiivi algus- ja lõppnäpud. arr tagastab algkursori, “arr + 5” tagastab kursori massiivist mööda ja 5 on massiivi suurus. Massiivi andmetüüp ja prioriteedimärgi andmetüüp peavad olema samad.

Prioriteedi kõige vähem väärtustamiseks oleks konstruktori deklaratsioon järgmine:

prioriteetsus, suurem > pq (arr, arr + 5);

Märkus. Rakenduses C ++ nimetatakse prioriteedimärki tegelikult adapteriks, mitte ainult konteineriks.

Kohandatud võrdluskood

Kõigi prioriteedijärjekorras olevate väärtuste tõusvas või kahanevas vormis hoidmine pole prioriteedijärjekorra ainus võimalus. Näiteks maksimaalse hunniku 11 täisarvu loend on:

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

Suurim väärtus on 88. Sellele järgneb kaks numbrit: 86 ja 87, mis on alla 88. Ülejäänud numbrid on nendest kolmest numbrist väiksemad, kuid tegelikult mitte korras. Loendis on kaks tühja lahtrit. Numbrid 84 ja 82 on väiksemad kui 86. Numbrid 79 ja 74 on väiksemad kui 87. Numbrid 80 ja 81 on väiksemad kui 84. Numbrid 64 ja 69 on väiksemad kui 79.

Numbrite paigutus järgib maksimaalse hunniku kriteeriume - vt hiljem. Sellise skeemi pakkumiseks prioriteedimärgile peab programmeerija esitama oma võrdluskoodi - vt hiljem.

Järeldus

C ++ prioriteedijärjekord on järjekord esimesest esimesest välja. Liikme funktsioon, suruma (), lisab järjekorda uue väärtuse. Liikme funktsioon, üles (), loeb järjekorra ülemise väärtuse. Liikme funktsioon, pop (), eemaldatakse järjekorra ülemist väärtust tagastamata. Liikme funktsioon, tühi(), kontrollib, kas järjekord on tühi. Priority_queue erineb aga järjekorrast selle poolest, et järgib mõnda prioriteetset algoritmi. See võib olla suurim, esimesest viimaseni või vähemasti esimesest viimaseni. Kriteeriumid (algoritm) võib olla ka programmeerija määratletud.

Rakenduse AppyMouse ekraanipaneel ja hiirekursor Windowsi tahvelarvutitele
Tahvelarvutite kasutajad tunnevad hiirekursorit sageli puudust, eriti kui neil on kombeks sülearvuteid kasutada. Puutetundliku ekraaniga nutitelefonid...
Hiire keskmine nupp ei tööta Windows 10-s
The hiire keskmine nupp aitab teil sirvida pikki rohke andmega veebisaite ja ekraane. Kui see peatub, siis lõpuks kasutate kerimiseks klaviatuuri, mis...
Kuidas muuta hiire vasakut ja paremat nuppu Windows 10 PC-s
On üsna tavaline, et kõik arvutihiirte seadmed on ergonoomiliselt mõeldud parempoolsete kasutajate jaoks. Kuid on olemas hiire seadmeid, mis on spetsi...