C ++

Jak používat C ++ Priority_queue?

Jak používat C ++ Priority_queue?
V C ++ je fronta datová struktura seznamu, kde první prvek, který má být vložen do seznamu, je prvním prvkem, který má být odstraněn, když má dojít k odebrání. Prioritní fronta v C ++ je podobná, ale má určité řazení; je to prvek s největší hodnotou, který je odstraněn jako první. Frontu priorit lze stále konfigurovat tak, aby se nejprve odstranil prvek s nejmenší hodnotou. Každá fronta musí mít alespoň tam() funkce a pop () funkce. The tam() funkce přidá nový prvek vzadu. Pro normální frontu je pop () funkce odebere první prvek, který byl kdy vložen. U prioritní fronty pop () funkce odebere prvek s nejvyšší prioritou, která může být největší nebo nejmenší, v závislosti na schématu objednávání.

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í_kategorie queueName;

S touto syntaxí je nejdříve odstraněna největší hodnota. Příkladem instance je:

prioritní_kategorie pq;

nebo

prioritní_kategorie pq;

Vektor 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í_kategorie, porovnat> pq;

Příkladem této instance je:

prioritní_kategorie, méně > pq;

Vš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ě“, Což znamená největší, a ne nutně první hodnotu, bude odstraněno jako první. Prohlášení o vytvoření lze tedy jednoduše napsat jako:

prioritní_kategorie > pq;

Pokud má být nejdříve odstraněna nejmenší hodnota, pak musí být příkaz:

prioritní_kategorie, větší > pq;

Dů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:

prioritní_kategorie pq;
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ší”, Pak odstraní prvek s nejmenší hodnotou. Při dalším volání odstraní další prvek s nejmenší hodnotou zbytku; znovu zavolá, odstraní další nejmenší přítomnou hodnotu atd. Vrací se prázdnota. Následující kód to ilustruje:

prioritní_kategorie, větší > pq;
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

prioritní_kategorie, větší > pq;
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<Výstup je 'a "b" c "d" e ".

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:

Porucha segmentace (jádro vyhozeno)

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í_kategorie pq;
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);
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:

prioritní_kategorie pq;
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:

prioritní_kategorie pq1;
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 pqA;
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:

prioritní_kategorie pq1;
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:

#zahrnout
prioritní_kategorie pq1;
ř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:

#zahrnout
vektor vtr = 10, 30, 20, 50, 40;
prioritní_kategorie pq (vtr.begin (), vtr.konec());
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í_kategorie, větší> int>> pq (vtr.begin (), vtr.konec());

Explicitní tvorba z pole
Frontu priority lze vytvořit explicitně z pole, jak ukazuje následující kód:

int arr [] = 10, 30, 20, 50, 40;
prioritní_kategorie pq (arr, arr + 5);
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í_kategorie, větší > pq (arr, arr + 5);

Pozná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.

Hry Top 10 her k hraní na Ubuntu
Top 10 her k hraní na Ubuntu
Platforma Windows byla jednou z dominujících platforem pro hraní her kvůli velkému procentu her, které se dnes vyvíjejí, aby nativně podporovaly Windo...
Hry 5 nejlepších arkádových her pro Linux
5 nejlepších arkádových her pro Linux
V dnešní době jsou počítače vážné stroje používané k hraní her. Pokud nemůžete získat nové vysoké skóre, budete vědět, co tím myslím. V tomto příspěvk...
Hry Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 vydané minulý měsíc, je šestým vývojovým vydáním v 1.13.série x a přináší řadu vylepšení, zejména do uživatelského rozhraní,...