Aby bylo možné použít prioritní frontu C ++, program by měl začínat kódem jako:
#zahrnout#zahrnout
pomocí jmenného prostoru std;
Zahrnuje knihovnu front do programu.
Aby mohl čtenář pokračovat ve čtení, měl mít základní znalosti jazyka C++.
Obsah článku
- Úvod - viz výše
- Základní konstrukce
- Důležité členské funkce
- Další funkce prioritní fronty
- Řetězcová data
- Další konstrukce prioritní fronty
- Závěr
Základní konstrukce
Než bude možné datovou strukturu použít, musí být nejprve vytvořena. Konstrukce zde znamená vytvoření instance objektu ze třídy fronty knihovny. Objekt fronty pak musí mít programátor pojmenovaný. Nejjednodušší syntaxe pro vytvoření prioritní fronty je:
prioritní_kategorieS touto syntaxí je nejdříve odstraněna největší hodnota. Příkladem instance je:
prioritní_kategorienebo
prioritní_kategorieVektor a deque jsou dvě datové struktury v jazyce C++. S prioritou lze vytvořit kteroukoli z nich. Syntaxe pro vytvoření prioritní fronty z vektorové struktury je:
prioritní_kategoriePříkladem této instance je:
prioritní_kategorieVšimněte si mezery mezi> a> na konci deklarace. To zabrání záměně s >>. Výchozí porovnávací kód je „méně
Pokud má být nejdříve odstraněna nejmenší hodnota, pak musí být příkaz:
prioritní_kategorieDůležité členské funkce
Funkce push ()
Tato funkce vloží hodnotu, která je jejím argumentem, do priority_queue. Vrací se prázdnota. Následující kód to ilustruje:
pq.tlačit (10);
pq.tlačit (30);
pq.tlačit (20);
pq.tlačit (50);
pq.tlačit (40);
Tato prioritní fronta přijala 5 celočíselných hodnot v pořadí 10, 30, 20, 50, 40. Pokud mají být všechny tyto prvky vyskakovány z prioritní fronty, vyjdou v pořadí 50, 40, 30, 20, 10.
Funkce pop ()
Tato funkce odebere z priority_queue hodnotu s nejvyšší prioritou. Pokud je porovnávací kód „větší
pq.tlačit ('a'); pq.tlačit ('c'); pq.tlačit ('b'); pq.tlačit ('e'); pq.tlačit ('d');
Všimněte si, že aby bylo možné volat členskou funkci, musí za názvem objektu následovat tečka a poté funkce.
Funkce top ()
The pop () funkce odstraní další hodnotu s nejvyšší prioritou, ale nevrátí ji jako pop () je neplatná funkce. Použijte horní() funkce, aby bylo možné zjistit hodnotu nejvyšší priority, která musí být následně odstraněna. The horní() funkce vrací kopii hodnoty s nejvyšší prioritou v prioritní_třídě. Následující kód, kde další hodnota s nejvyšší prioritou je nejnižší hodnota, to ilustruje
pq.tlačit ('a'); pq.tlačit ('c'); pq.tlačit ('b'); pq.tlačit ('e'); pq.tlačit ('d');
char ch1 = pq.horní(); pq.pop ();
char ch2 = pq.horní(); pq.pop ();
char ch3 = pq.horní(); pq.pop ();
char ch4 = pq.horní(); pq.pop ();
char ch5 = pq.horní(); pq.pop ();
cout<
Funkce empty ()
Pokud programátor používá horní() funkce na prázdnou prioritní_kanálu, po úspěšné kompilaci by obdržel chybovou zprávu, jako například:
Před použitím tedy vždy zkontrolujte, zda prioritní fronta není prázdná horní() funkce. The prázdný() členské funkce vrací bool, true, pokud je fronta prázdná, a false, pokud fronta není prázdná. Následující kód to ilustruje:
prioritní_kategorieint i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tlačit (i1); pq.tlačit (i2); pq.tlačit (i3); pq.tlačit (i4); pq.tlačit (i5);
zatímco(!pq.prázdný())
cout << pq.top() << ";
pq.pop ();
cout << '\n';
Další funkce prioritní fronty
Funkce size ()
Tato funkce vrací délku prioritní fronty, jak ukazuje následující kód:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tlačit (i1); pq.tlačit (i2); pq.tlačit (i3); pq.tlačit (i4); pq.tlačit (i5);
int len = pq.velikost();
cout << len << '\n';
Výstup je 5.
Funkce swap ()
Pokud jsou dva priority_queues stejného typu a velikosti, mohou být touto funkcí zaměněny, jak ukazuje následující kód:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.tlačit (i1); pq1.tlačit (i2); pq1.tlačit (i3); pq1.tlačit (i4); pq1.tlačit (i5);
prioritní_kategorie
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.tlačit (it1); pqA.tlačit (it2); pqA.tlačit (it3); pqA.tlačit (it4); pqA.tlačit (it5);
pq1.swap (pqA);
zatímco(!pq1.prázdný())
cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
zatímco(!pqA.prázdný())
cout << pqA.top() << ";
pqA.pop ();
cout<<'\n';
Výstupem je:
5 4 3 2 1
50 40 30 20 10
Funkce emplace ()
The umístit() funkce je obdobou funkce push. Následující kód to ilustruje:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.místo (i1); pq1.emplace (i2); pq1.místo (i3); pq1.emplace (i4); pq1.emplace (i5);
zatímco(!pq1.prázdný())
cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
Výstupem je:
50 40 30 20 10
Řetězcová data
Při porovnávání řetězců by měla být použita třída řetězce a ne přímé použití řetězcových literálů, protože by porovnávala ukazatele a ne skutečné řetězce. Následující kód ukazuje, jak se používá třída řetězce:
#zahrnoutprioritní_kategorie
řetězec s1 = řetězec ("pero"), s2 = řetězec ("tužka"), s3 = řetězec ("cvičebnice"), s4 = řetězec ("učebnice"), s5 = řetězec ("pravítko");
pq1.tlačit (s1); pq1.tlačit (s2); pq1.tlačit (s3); pq1.tlačit (s4); pq1.tlačit (s5);
zatímco(!pq1.prázdný())
cout << pq1.top() << " ";
pq1.pop ();
cout<<'\n';
Výstupem je:
textová kniha pravítko tužka pero sešit
Další konstrukce prioritní fronty
Výslovné vytvoření z vektoru
Frontu priority lze vytvořit explicitně z vektoru, jak ukazuje následující kód:
vektor
prioritní_kategorie
zatímco(!pq.prázdný())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';
Výstup je: 50 40 30 20 10. Tentokrát musí být také zahrnuto záhlaví vektoru. Argumenty pro funkci konstruktoru přebírají počáteční a koncový ukazatel vektoru. Datový typ pro vektor a datový typ pro prioritní_klíč musí být stejný.
Aby byla nejmenší hodnota prioritou, deklarace pro konstruktor by byla:
prioritní_kategorieExplicitní tvorba z pole
Frontu priority lze vytvořit explicitně z pole, jak ukazuje následující kód:
prioritní_kategorie
zatímco(!pq.prázdný())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';
Výstup je: 50 40 30 20 10. Argumenty pro funkci konstruktoru přebírají počáteční a koncový ukazatel pole. arr vrátí počáteční ukazatel, „arr + 5“ vrátí ukazatel hned za maticí a 5 je velikost pole. Datový typ pro pole a datový typ pro prioritní_číslo musí být stejné.
Aby byla nejmenší hodnota prioritou, deklarace pro konstruktor by byla:
prioritní_kategoriePoznámka: V jazyce C ++ se prioritní_skript vlastně nazývá adaptér, nejen kontejner.
Vlastní srovnávací kód
Mít všechny hodnoty v prioritní frontě vzestupně nebo všechny sestupně není jedinou možností pro prioritní frontu. Například seznam 11 celých čísel pro maximální hromadu je:
88, 86, 87, 84, 82, 79,74, 80, 81,,, 64, 69
Nejvyšší hodnota je 88. Poté následují dvě čísla: 86 a 87, což je méně než 88. Zbytek čísel je méně než tato tři čísla, ale ne ve správném pořadí. V seznamu jsou dvě prázdné buňky. Čísla 84 a 82 jsou méně než 86. Čísla 79 a 74 jsou menší než 87. Čísla 80 a 81 jsou menší než 84. Čísla 64 a 69 jsou méně než 79.
Umístění čísel se řídí kritérii maximální haldy - viz dále. Aby bylo možné poskytnout takové schéma pro prioritní_kategorii, musí programátor poskytnout svůj vlastní porovnávací kód - viz dále.
Závěr
C ++ priority_queue je fronta první-první-první. Členská funkce, tam(), přidá do fronty novou hodnotu. Členská funkce, horní(), přečte nejvyšší hodnotu ve frontě. Členská funkce, pop (), odebere bez vrácení nejvyšší hodnoty fronty. Členská funkce, prázdný(), zkontroluje, zda je fronta prázdná. Priority_queue se však liší od fronty v tom, že následuje nějaký prioritní algoritmus. Může být největší, od prvního do posledního, nebo nejméně, od prvního do posledního. Kritéria (algoritmus) mohou být také definována programátorem.