logo

Prioritní fronta v C++ Standard Template Library (STL)

A Prioritní fronta C++ je typ adaptéru kontejneru , speciálně navržený tak, že první prvek fronty je buď největší, nebo nejmenší ze všech prvků ve frontě a prvky jsou v nerostoucím nebo neklesajícím pořadí (proto vidíme, že každý prvek fronty má prioritu {pevné pořadí}).

V C++ STL je nejvyšší prvek ve výchozím nastavení vždy největší. Můžeme jej také změnit na nejmenší prvek nahoře. Prioritní fronty jsou postaveny na horní části maximální hromady a používají pole nebo vektor jako vnitřní strukturu. zjednodušeně řečeno, Prioritní fronta STL je implementace C++








// C++ program to demonstrate the use of priority_queue> #include> #include> using> namespace> std;> // driver code> int> main()> {> >int> arr[6] = { 10, 2, 4, 8, 6, 9 };> >// defining priority queue> >priority_queue<>int>>pq;> >// printing array> >cout <<>'Array: '>;> >for> (>auto> i : arr) {> >cout << i <<>;> >}> >cout << endl;> >// pushing array sequentially one by one> >for> (>int> i = 0; i <6; i++) {> >pq.push(arr[i]);> >}> >// printing priority queue> >cout <<>'Priority Queue: '>;> >while> (!pq.empty()) {> >cout << pq.top() <<>;> >pq.pop();> >}> >return> 0;> }>



>

>

Výstup

Array: 10 2 4 8 6 9 Priority Queue: 10 9 8 6 4 2>
max. fronta priority haldy

Max. fronta priority haldy (výchozí schéma)

Jak vytvořit minimální hromadu pro prioritní frontu?

Jak jsme viděli dříve, prioritní fronta je ve výchozím nastavení v C++ implementována jako maximální halda, ale také nám poskytuje možnost změnit ji na minimální haldu předáním jiného parametru při vytváření fronty priority.

Syntax:

priority_queue  gq;>

kde,

    „int“ je typ prvků, které chcete uložit do prioritní fronty. V tomto případě je to celé číslo. Můžete vyměnit int s jakýmkoli jiným typem dat, který potřebujete. „vektor“ je typ vnitřního kontejneru používaného k ukládání těchto prvků. std::priority_queue není kontejner sám o sobě, ale osvojitel kontejneru. Obaluje další nádoby. V tomto příkladu používáme a vektor , ale můžete si vybrat jiný kontejner, který podporuje metody front(), push_back() a pop_back().
  • ' větší ‘ je vlastní porovnávací funkce. To určuje, jak jsou prvky seřazeny v prioritní frontě. V tomto konkrétním příkladu větší nastaví a min-hromada . To znamená, že nejmenší prvek bude nahoře ve frontě.

V případě maximální haldy jsme je nemuseli specifikovat, protože výchozí hodnoty pro ně jsou již vhodné pro maximální haldu.

Příklad:

C++




// C++ program to demonstrate> // min heap for priority queue> #include> #include> using> namespace> std;> void> showpq(> >priority_queue<>int>, vector<>int>>, větší<>int>>> g)> {> >while> (!g.empty()) {> >cout <<> << g.top();> >g.pop();> >}> >cout <<>' '>;> }> void> showArray(>int>* arr,>int> n)> {> >for> (>int> i = 0; i cout << arr[i] << ' '; } cout << endl; } // Driver Code int main() { int arr[6] = { 10, 2, 4, 8, 6, 9 }; priority_queue , větší > gquiz( arr, arr + 6); cout<< 'Array: '; showArray(arr, 6); cout << 'Priority Queue : '; showpq(gquiz); return 0; }>

>

>

Výstup

Array: 10 2 4 8 6 9 Priority Queue : 2 4 6 8 9 10>
min prioritní fronta haldy

Minimální prioritní fronta haldy

Poznámka: Výše uvedená syntaxe může být obtížně zapamatovatelná, takže v případě číselných hodnot můžeme hodnoty vynásobit -1 a použít maximální haldu, abychom získali efekt minimální haldy. Nejen, že můžeme použít vlastní metodu třídění nahrazením větší s funkcí vlastního komparátoru.

java matematická třída

Metody prioritní fronty

Následující seznam všech metod třídy std::priority_queue:

Metoda

Definice

prioritní_fronta::empty() Vrací, zda je fronta prázdná.
prioritní_fronta::velikost() Vrátí velikost fronty.
prioritní_fronta::top() Vrátí odkaz na nejvyšší prvek fronty.
prioritní_fronta::push() Přidá prvek „g“ na konec fronty.
prioritní_fronta::pop() Odstraní první prvek fronty.
prioritní_fronta::swap() Používá se k výměně obsahu dvou front za předpokladu, že fronty musí být stejného typu, i když velikosti se mohou lišit.
prioritní_fronta::emplace() Používá se k vložení nového prvku do kontejneru prioritní fronty.
typ_hodnoty prioritní fronty Představuje typ objektu uloženého jako prvek ve frontě priority. Funguje jako synonymum pro parametr šablony.

Operace na prioritní frontě v C++

1. Vkládání a odebírání prvků prioritní fronty

The TAM() metoda se používá k vložení prvku do prioritní fronty. Chcete-li odebrat prvek z prioritní fronty, použijte pop() Tato metoda se používá, protože odstraní prvek s nejvyšší prioritou.

Níže je uveden program C++ pro různé funkce v prioritní frontě:

seznam šipek

C++




// C++ Program to demonstrate various> // method/function in Priority Queue> #include> #include> using> namespace> std;> // Implementation of priority queue> void> showpq(priority_queue<>int>>gq)> {> >priority_queue<>int>>g = gq;> >while> (!g.empty()) {> >cout <<> << g.top();> >g.pop();> >}> >cout <<>' '>;> }> // Driver Code> int> main()> {> >priority_queue<>int>>gquiz;> >// used in inserting the element> >gquiz.push(10);> >gquiz.push(30);> >gquiz.push(20);> >gquiz.push(5);> >gquiz.push(1);> >cout <<>'The priority queue gquiz is : '>;> > >// used for highlighting the element> >showpq(gquiz);> >// used for identifying the size> >// of the priority queue> >cout <<>' gquiz.size() : '> <<> >gquiz.size();> >// used for telling the top element> >// in priority queue> >cout <<>' gquiz.top() : '> <<> >gquiz.top();> >// used for popping the element> >// from a priority queue> >cout <<>' gquiz.pop() : '>;> >gquiz.pop();> >showpq(gquiz);> >return> 0;> }>

>

>

Výstup

The priority queue gquiz is : 30 20 10 5 1 gquiz.size() : 5 gquiz.top() : 30 gquiz.pop() : 20 10 5 1>

Viz konec pro analýzu složitosti.

Poznámka : Výše ​​zobrazená je jedna z metod inicializace prioritní fronty. Chcete-li se dozvědět více o efektivní inicializaci prioritní fronty, klikněte sem.

2. Přístup k hornímu prvku prioritní fronty

K hornímu prvku prioritní fronty lze přistupovat pomocí horní() metoda.

C++




// C++ program to access the top> // element of priority queue> #include> #include> using> namespace> std;> // Driver code> int> main()> {> >// create a priority queue of int> >priority_queue<>int>>čísla;> >// add items to priority_queue> >numbers.push(1);> >numbers.push(20);> >numbers.push(7);> >// get the element at the top> >cout <<>'Top element: '> <<> >numbers.top();> >return> 0;> }>

>

>

Výstup

Top element: 20>

Viz konec pro analýzu složitosti.

Poznámka: Máme přístup pouze k hornímu prvku v prioritní frontě.

3. Chcete-li zkontrolovat, zda je prioritní fronta prázdná nebo ne:

Ke kontrole, zda je fronta priority prázdná, používáme metodu empty(). Tato metoda vrací:

    True – Je vrácena, když je prioritní fronta prázdná a je reprezentována 1 False – Je vytvořena, když prioritní fronta není prázdná nebo False a je charakterizována 0

Příklad:

C++




// C++ program to demonstrate> // Implementation of empty() function> #include> #include> using> namespace> std;> // Driver code> int> main()> {> >priority_queue<>int>>pqueueGFG;> >pqueueGFG.push(1);> > >// Priority Queue becomes 1> >// check if it is empty or not> >if> (pqueueGFG.empty())> >{> >cout <<>'Empty or true'>;> >}> >else> >{> >cout <<>'Contains element or False'>;> >}> >return> 0;> }>

>

>

Výstup

Contains element or False>

Viz konec pro analýzu složitosti.

4. Chcete-li získat/zkontrolovat velikost prioritní fronty

Určuje velikost prioritní fronty. Jednoduše řečeno, velikost() metoda se používá k získání počtu prvků přítomných v Prioritní fronta .

Níže je uveden program C++ pro kontrolu velikosti prioritní fronty:

C++




// C++ program to demonstrate the> // size() method of priority queue> #include> #include> using> namespace> std;> // Driver code> int> main()> {> >// create a priority queue of string> >priority_queue pqueue;> >// add items to priority_queue> >pqueue.push(>'Geeks'>);> >pqueue.push(>'for'>);> >pqueue.push(>'Geeks'>);> >pqueue.push(>'C++'>);> >// get the size of queue> >int> size = pqueue.size();> >cout <<>'Size of the queue: '> << size;> >return> 0;> }>

>

>

Výstup

Size of the queue: 4>

Viz konec pro analýzu složitosti.

podmíněný operátor v jazyce Java

5. Zaměnit obsah prioritní fronty za jinou podobného typu

Swap() Funkce se používá k výměně obsahu jedné prioritní fronty s jinou prioritní frontou stejného typu a stejné nebo různé velikosti.

Níže je uveden program C++ pro výměnu obsahu prioritní fronty za jinou podobného typu:

C++




// CPP program to illustrate> // Implementation of swap() function> #include> using> namespace> std;> // Print elements of priority queue> void> print(priority_queue<>int>>pq)> {> >while> (!pq.empty()) {> >cout << pq.top() <<>;> >pq.pop();> >}> >cout << endl;> }> int> main()> {> >// priority_queue container declaration> >priority_queue<>int>>pq1;> >priority_queue<>int>>pq2;> >// pushing elements into the 1st priority queue> >pq1.push(1);> >pq1.push(2);> >pq1.push(3);> >pq1.push(4);> >// pushing elements into the 2nd priority queue> >pq2.push(3);> >pq2.push(5);> >pq2.push(7);> >pq2.push(9);> >cout <<>'Before swapping:-'> << endl;> >cout <<>'Priority Queue 1 = '>;> >print(pq1);> >cout <<>'Priority Queue 2 = '>;> >print(pq2);> >// using swap() function to swap elements of priority> >// queues> >pq1.swap(pq2);> >cout << endl <<>'After swapping:-'> << endl;> >cout <<>'Priority Queue 1 = '>;> >print(pq1);> >cout <<>'Priority Queue 2 = '>;> >print(pq2);> >return> 0;> }> // This code is contributed by Susobhan Akhuli>

>

>

Výstup

Before swapping:- Priority Queue 1 = 4 3 2 1 Priority Queue 2 = 9 7 5 3 After swapping:- Priority Queue 1 = 9 7 5 3 Priority Queue 2 = 4 3 2 1>

Viz konec pro analýzu složitosti.

6. Chcete-li vložit nový prvek do kontejneru fronty priority

Umístit() Funkce slouží k vložení nového prvku do kontejneru prioritní fronty, nový prvek je přidán do prioritní fronty podle své priority. Je to podobné jako u tlačného provozu. Rozdíl je v tom, že operace emplace() šetří zbytečnou kopii objektu.

Níže je uveden program C++ pro vložení nového prvku do kontejneru prioritní fronty:

volání funkce javascript z html

C++




// CPP program to illustrate> // Implementation of emplace() function> #include> using> namespace> std;> int> main()> {> >priority_queue<>int>>pq;> >pq.emplace(1);> >pq.emplace(2);> >pq.emplace(3);> >pq.emplace(4);> >pq.emplace(5);> >pq.emplace(6);> >// Priority queue becomes 1, 2, 3, 4, 5, 6> >// Printing the priority queue> >cout <<>'Priority Queue = '>;> >while> (!pq.empty()) {> >cout << pq.top() <<>;> >pq.pop();> >}> >return> 0;> }> // This code is contributed by Susobhan Akhuli>

>

>

Výstup

Priority Queue = 6 5 4 3 2 1>

Viz konec pro analýzu složitosti.

7. K reprezentaci typu objektu uloženého jako prvek ve frontě priority

Metoda priority_queue :: value_type je vestavěná funkce v C++ STL, která představuje typ objektu uložený jako prvek ve frontě priority. Funguje jako synonymum pro parametr šablony.

Syntax:

priority_queue::value_type variable_name>

Níže je uveden program C++, který představuje typ objektu uloženého jako prvek ve frontě priority:

C++




// C++ program to illustrate the> // priority_queue :: value_type function> #include> using> namespace> std;> // Driver code> int> main()> {> >// declare integer value_type for priority queue> >priority_queue<>int>>::typ_hodnoty AnInt;> >// declare string value_type for priority queue> >priority_queue::value_type AString;> >// Declares priority_queues> >priority_queue<>int>>q1;> >priority_queue q2;> >// Here AnInt acts as a variable of int data type> >AnInt = 20;> >cout <<>'The value_type is AnInt = '> << AnInt << endl;> >q1.push(AnInt);> >AnInt = 30;> >q1.push(AnInt);> >cout <<>'Top element of the integer priority_queue is: '> ><< q1.top() << endl;> >// here AString acts as a variable of string data type> >AString =>'geek'>;> >cout << endl> ><<>'The value_type is AString = '> << AString> ><< endl;> >q2.push(AString);> >AString =>'for'>;> >q2.push(AString);> >AString =>'geeks'>;> >q2.push(AString);> >cout <<>'Top element of the string priority_queue is: '> ><< q2.top() << endl;> >return> 0;> }> // This code is contributed by Susobhan Akhuli>

>

>

Výstup

The value_type is AnInt = 20 Top element of the integer priority_queue is: 30 The value_type is AString = geek Top element of the string priority_queue is: geeks>

Viz konec pro analýzu složitosti.

Složitost všech operací:

Metody

registrovat paměť

Časová složitost

Pomocný prostor

prioritní_fronta::empty()

O(1)

O(1)

prioritní_fronta::velikost()

O(1)

O(1)

prioritní_fronta::top()

O(1)

O(1)

prioritní_fronta::push()

O(logN)

O(1)

prioritní_fronta::pop()

O(logN)

O(1)

prioritní_fronta::swap()

O(1)

NA)

prioritní_fronta::emplace()

O(logN)

O(1)

typ_hodnoty prioritní fronty

O(1)

O(1)