C ++

Ako používať C ++ Priority_queue?

Ako používať C ++ Priority_queue?
V C ++ je frontom dátová štruktúra zoznamu, kde prvý prvok, ktorý sa má vložiť do zoznamu, je prvým prvkom, ktorý sa má odstrániť, keď sa má vykonať odstránenie. Prioritná fronta v C ++ je podobná, ale má určité usporiadanie; je to prvok s najväčšou hodnotou, ktorý je odstránený ako prvý. Frontu priorít je možné stále nakonfigurovať tak, aby sa najskôr odstránil prvok s najmenšou hodnotou. Akákoľvek fronta musí mať minimálne tam() funkcie a pop () funkcia. The tam() funkcia pridá nový prvok zozadu. Pre normálny rad je to pop () funkcia odstráni prvý vložený prvok. V prípade prioritného frontu pop () Funkcia odstráni prvok s najvyššou prioritou, ktorá môže byť najväčšia alebo najmenšia, v závislosti od schémy objednávania.

Aby bolo možné použiť prioritnú frontu C ++, program by mal začínať kódom ako:

#include
#include
pomocou namespace std;

Zahŕňa knižnicu frontov do programu.

Aby mohol čitateľ pokračovať v čítaní, mal mať základné vedomosti o jazyku C++.

Obsah článku

  • Úvod - pozri vyššie
  • Základná konštrukcia
  • Dôležité členské funkcie
  • Ďalšie funkcie prioritného frontu
  • Údaje reťazca
  • Ostatné stavby prednostného frontu
  • Záver

Základná konštrukcia

Pred použitím je potrebné najskôr zostaviť dátovú štruktúru. Konštrukcia tu znamená vytvorenie inštancie objektu z triedy frontu knižnice. Objekt frontu potom musí mať programátor pomenovaný podľa svojho názvu. Najjednoduchšia syntax na vytvorenie prioritného frontu je:

prioritná_hodnota queueName;

Pri tejto syntaxi sa najskôr odstráni najväčšia hodnota. Príklad inštancie je:

prioritná_hodnota pq;

alebo

prioritná_hodnota pq;

Vektor a deque sú dve dátové štruktúry v jazyku C++. S prioritou je možné vytvoriť ľubovoľnú z nich. Syntax na vytvorenie prioritného frontu z vektorovej štruktúry je:

prioritná_hodnota, porovnaj> pq;

Príkladom tejto inštancie je:

prioritná_hodnota, menej > pq;

Všimnite si medzeru medzi> a> na konci vyhlásenia. To zabráni zámene s >>. Predvolený porovnávací kód je „menej”, Čo znamená najväčšiu, a nie nevyhnutne prvú hodnotu, bude odstránené ako prvé. Príkaz na vytvorenie teda môžeme jednoducho napísať ako:

prioritná_hodnota > pq;

Ak sa má najskôr odstrániť najmenšia hodnota, potom musí byť príkaz:

prioritná_hodnota, väčší > pq;

Dôležité členské funkcie

Funkcia push ()
Táto funkcia vloží hodnotu, ktorá je jej argumentom, do priority_queue. Vráti sa neplatné. Ilustruje to nasledujúci kód:

prioritná_hodnota pq;
pq.tlačiť (10);
pq.tlačiť (30);
pq.tlačiť (20);
pq.tlačiť (50);
pq.tlačiť (40);

Táto prioritná_obrana získala 5 celočíselných hodnôt v poradí 10, 30, 20, 50, 40. Ak majú byť všetky tieto prvky vyskočené z frontu priorít, vyjdú v poradí 50, 40, 30, 20, 10.

Funkcia pop ()
Táto funkcia odstráni z priority_queue hodnotu s najvyššou prioritou. Ak je porovnávací kód „väčší”, Potom sa odstráni prvok s najmenšou hodnotou. Ak sa zavolá znova, odstráni nasledujúci prvok s najmenšou hodnotou zo zvyšku; opätovné volanie, odstráni nasledujúcu najmenšiu prítomnú hodnotu atď. Vráti sa neplatné. Ilustruje to nasledujúci kód:

prioritná_hodnota, väčší > pq;
pq.push („a“); pq.push ('c'); pq.tlačiť ('b'); pq.push ('e'); pq.push ('d');

Upozorňujeme, že aby bolo možné zavolať členskú funkciu, musí za názvom objektu nasledovať bodka a potom nasledovať funkcia.

Funkcia hore ()
The pop () funkcia odstráni nasledujúcu hodnotu s najvyššou prioritou, ale nevráti ju, ako pop () je neplatná funkcia. Použi hore () funkcie, aby ste poznali hodnotu s najvyššou prioritou, ktorá musí byť následne odstránená. The hore () funkcia vráti kópiu hodnoty s najvyššou prioritou v prioritnej_kóre. Nasledujúci kód, kde ďalšia hodnota s najvyššou prioritou je najmenšia hodnota, to ilustruje

prioritná_hodnota, väčší > pq;
pq.push („a“); pq.push ('c'); pq.tlačiť ('b'); pq.push ('e'); pq.push ('d');
char ch1 = pq.hore (); pq.pop ();
char ch2 = pq.hore (); pq.pop ();
char ch3 = pq.hore (); pq.pop ();
char ch4 = pq.hore (); pq.pop ();
char ch5 = pq.hore (); pq.pop ();
cout<Výstup je 'a "b" c "d" e ".

Funkcia empty ()
Ak programátor používa hore () funkcia na prázdnu prioritnú_kategóriu, po úspešnej kompilácii by dostal chybové hlásenie ako:

Porucha segmentácie (vyradené jadro)

Pred použitím súboru teda vždy skontrolujte, či prioritný front nie je prázdny hore () funkcia. The prázdne () členská funkcia vracia bool, true, ak je fronta prázdna, a false, ak fronta nie je prázdna. Ilustruje to nasledujúci kód:

prioritná_hodnota pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tlačiť (i1); pq.tlačiť (i2); pq.tlačiť (i3); pq.tlačiť (i4); pq.tlačiť (i5);
zatiaľ čo (!pq.prázdne ())

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

cout << '\n';

Ďalšie funkcie prioritného frontu

Funkcia size ()
Táto funkcia vracia dĺžku frontu priorít, ako ukazuje nasledujúci kód:

prioritná_hodnota pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tlačiť (i1); pq.tlačiť (i2); pq.tlačiť (i3); pq.tlačiť (i4); pq.tlačiť (i5);
int len ​​= pq.veľkosť ();
cout << len << '\n';

Výstup je 5.

Funkcia swap ()
Ak sú dva prioritné_kanály rovnakého typu a veľkosti, môžu byť pomocou tejto funkcie zamenené, ako ukazuje nasledujúci kód:

prioritná_hodnota pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.tlačiť (i1); pq1.tlačiť (i2); pq1.tlačiť (i3); pq1.tlačiť (i4); pq1.tlačiť (i5);
prioritná_hodnota pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.tlačiť (it1); pqA.tlačiť (it2); pqA.tlačiť (it3); pqA.tlačiť (it4); pqA.tlačiť (it5);
pq1.swap (pqA);
zatiaľ čo (!pq1.prázdne ())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
zatiaľ čo (!pqA.prázdne ())

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

Výstup je:

5 4 3 2 1
50 40 30 20 10

Funkcia emplace ()
The miesto () funkcia je podobná funkcii push. Ilustruje to nasledujúci kód:

prioritná_hodnota pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.miesto (i1); pq1.miesto (i2); pq1.miesto (i3); pq1.miesto (i4); pq1.emplace (i5);
zatiaľ čo (!pq1.prázdne ())

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

Výstup je:

50 40 30 20 10

Údaje reťazca

Pri porovnávaní reťazcov by sa mala použiť trieda reťazcov a nie priame použitie reťazcových literálov, pretože by porovnávali ukazovatele a nie skutočné reťazce. Nasledujúci kód ukazuje, ako sa používa trieda reťazcov:

#include
prioritná_hodnota pq1;
reťazec s1 = reťazec („pero“), s2 = reťazec („ceruzka“), s3 = reťazec („cvičebnica“), s4 = reťazec („učebnica“), s5 = reťazec („pravítko“);
pq1.tlačiť (s1); pq1.tlačiť (s2); pq1.tlačiť (s3); pq1.tlačiť (s4); pq1.tlačiť (s5);
zatiaľ čo (!pq1.prázdne ())

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

Výstup je:

textová kniha pravítko ceruzka pero cvičebnica

Ostatné stavby prednostného frontu

Výslovné vytvorenie z vektora
Frontu priorít je možné vytvoriť explicitne z vektora, ako ukazuje nasledujúci kód:

#include
vektor vtr = 10, 30, 20, 50, 40;
prioritná_hodnota pq (vtr.begin (), vtr.koniec());
zatiaľ čo (!pq.prázdne ())

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

Výstup je: 50 40 30 20 10. Tentokrát musí byť zahrnutá aj hlavička vektora. Argumenty pre funkciu konštruktora majú počiatočný a konečný ukazovateľ vektora. Dátový typ pre vektor a dátový typ pre prioritnú_kategóriu musia byť rovnaké.

Aby bola z priority najmenšia hodnota, vyhlásenie pre konštruktora by bolo:

prioritná_hodnota, väčšie> int>> pq (vtr.begin (), vtr.koniec());

Výslovné vytvorenie z poľa
Prioritný front je možné vytvoriť explicitne z poľa, ako ukazuje nasledujúci kód:

int arr [] = 10, 30, 20, 50, 40;
prioritná_hodnota pq (arr, arr + 5);
zatiaľ čo (!pq.prázdne ())

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

Výstup je: 50 40 30 20 10. Argumenty pre funkciu konštruktora majú počiatočný a konečný ukazovateľ poľa. arr vráti začiatočný ukazovateľ, „arr + 5“ vráti ukazovateľ tesne za poľom a 5 je veľkosť poľa. Dátový typ pre pole a dátový typ pre prioritnú_kategóriu musia byť rovnaké.

Aby bola z priority najmenšia hodnota, vyhlásenie pre konštruktora by bolo:

prioritná_hodnota, väčší > pq (arr, arr + 5);

Poznámka: V C ++ sa prioritná_skript v skutočnosti nazýva adaptér, nielen kontajner.

Vlastný porovnávací kód

Zvyšovanie alebo klesanie všetkých hodnôt v prioritnom fronte nie je jedinou možnosťou pre prioritný front. Napríklad zoznam 11 celých čísel pre maximálnu hromadu je:

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

Najvyššia hodnota je 88. Nasledujú dve čísla: 86 a 87, čo je menej ako 88. Zvyšok čísel je menej ako tieto tri čísla, ale nie v poriadku. V zozname sú dve prázdne bunky. Čísla 84 a 82 sú menej ako 86. Čísla 79 a 74 sú menej ako 87. Čísla 80 a 81 sú menej ako 84. Čísla 64 a 69 sú menej ako 79.

Umiestnenie čísel sa riadi kritériami maximálnej haldy - pozri ďalej. Aby bolo možné poskytnúť takúto schému pre prioritnú_kategóriu, musí programátor poskytnúť svoj vlastný porovnávací kód - pozri ďalej.

Záver

C ++ priority_queue je front typu „prvý-prvý-prvý-von“. Členská funkcia, tam(), pridáva do frontu novú hodnotu. Členská funkcia, hore (), načíta najvyššiu hodnotu vo fronte. Členská funkcia, pop (), odstráni bez vrátenia najvyššej hodnoty frontu. Členská funkcia, prázdne (), skontroluje, či je rad prázdny. Prioritná_nážka sa však líši od fronty v tom, že sa riadi niektorým prioritným algoritmom. Môže byť najväčší, od prvého do posledného, ​​alebo najmenej, od prvého do posledného. Kritériá (algoritmus) môžu byť definované aj programátorom.

Hry Najlepšie hry Oculus App Lab
Najlepšie hry Oculus App Lab
Ak ste vlastníkom náhlavnej súpravy Oculus, musíte byť informovaní o bočnom nakladaní. Sideloading je proces inštalácie neuloženého obsahu do náhlavne...
Hry Top 10 hier, ktoré sa dajú hrať na Ubuntu
Top 10 hier, ktoré sa dajú hrať na Ubuntu
Platforma Windows je jednou z dominujúcich platforiem pre hry kvôli obrovskému percentu hier, ktoré sa dnes vyvíjajú na natívnu podporu systému Window...
Hry 5 najlepších arkádových hier pre Linux
5 najlepších arkádových hier pre Linux
V dnešnej dobe sú počítače vážne stroje používané na hranie hier. Ak nemôžete dosiahnuť nové najvyššie skóre, budete vedieť, čo tým myslím. V tomto pr...