一個容器適配器,維持一組元素,其中最大(或最高優先權)元素總是在頂端可存取。 你可以新增元素並移除或檢視頂端元素,但無法直接存取集合中間的元素。
語法
template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue
參數
Type
要儲存在 priority_queue.
Container
儲存 元素 priority_queue的底層容器類型。
Compare
提供一個函式物件,將兩個元素值作為排序鍵比較,以決定它們在 中的 priority_queue相對順序。 此引數是選擇性的。 二元謂詞 less<typename Container::value_type> 是預設條件。
備註
物件第一個範本參數priority_queue中指定的類別Type元素,等價value_type且必須與第二個範本參數所指定的底層容器類別Container中的元素類型相符。 必須 Type 是可指派的,也就是說你可以複製該類型的物件,並將值指派給該類型的變數。
該會 priority_queue 使用比較函數來判斷哪些元素優先權較高。 此比較函數是類別 Traits的函數物件。 要處理 priority_queue,你的元素只需支援使用小於算子(<)來比較,以便能將元素排列順序排列。
你可以更改 priority_queue. 你可能想這麼做,出於效能考量。 預設 vector的 通常是快取區域性的最佳選擇,因為元素會儲存在連續的儲存中,且隨著擴充,配置次數會減少。 但你或許會考慮 deque ,如果你的隊列非常大或無界,且移動元素會很昂貴。 欲了解更多適合底層容器類別的資訊,請參見 container_type。
兩者的元素加減 priority_queue 具有對數級複雜度。 存取 priority_queue 中的項目具有常數複雜度。
C++ 標準函式庫定義了其他容器適配器,你可以用來儲存元素:priority_queuestack、 queue、 priority_queue和 :
- 類別
stack支持最後一個先出 (LIFO) 資料結構。 想像一堆盤子:你只能從堆疊的頂端(底部容器末端)插入、檢查或移除元件(板子)。 - 類別
queue支援先進先出 (FIFO) 數據結構。 想像排成一列的人。 你先把元素(人)加到隊伍的後面,然後把他們從隊伍的前面移除。 管線的正反兩端都可以被檢查。 - 該
priority_queue類別對其元素排序,使得最大元素總是在最上方。 它支援插入項目,以及檢查和移除頂端項目。
範例
-
檢查是否空了
priority_queue - 彈出元素與檢查隊列大小
- 使用自訂容器和比較器
- 推進元素並閱讀頂部
- 取得元素的數量
- 存取頂層元素
- 使用priority_queue value_type別名
- 使用使用者自訂的資料型別
建構函式
| 建構函式 | 描述 |
|---|---|
priority_queue |
建構 priority_queue,它可以是空的,或是基底容器物件範圍的複本,或是其他 priority_queue 的複本。 |
Typedefs
| 類型名稱 | 描述 |
|---|---|
container_type |
一種提供基礎容器並使其 priority_queue 適應的類型。 |
size_type |
不帶正負號的整數類型,可以表示 priority_queue 中的項目數。 |
value_type |
此類型代表儲存為 priority_queue 項目的物件類型。 |
成員函式
| 成員函數 | 描述 |
|---|---|
empty |
測試 priority_queue 是否為空白。 |
pop |
從頂端位置移除 priority_queue 的最大項目。 |
push |
根據專案的 operator<優先順序,將專案加入至優先順序佇列。 |
size |
傳回 priority_queue 中項目的數目。 |
top |
傳回 priority_queue 頂端最大項目的 const 參考。 |
需求
標頭:<queue>
命名空間:std
priority_queue::container_type
提供要配接之基底容器的類型。
typedef Container container_type;
備註
此類型是範本參數 Container的同義字。
適合的priority_queue底層容器類別包括 deque Class(預設vector類別),或任何支援 、 push_back、 pop_back 及 的操作front的序列容器,以及隨機存取迭代器。 容器適配器封裝底層容器類別,並僅以公開介面形式暴露有限的序列容器成員函式。
關於如何宣告與使用的container_type範例,請參見「使用自訂容器與比較器」
priority_queue::empty
測試 priority_queue 是否為空白。
bool empty() const;
傳回值
true 如果 是空的 priority_queue ,則為 , false 如果 為空,則 priority_queue 為 。
範例:檢查 是否 priority_queue 為空
// compile with: /EHsc
#include <queue>
#include <iostream>
int main()
{
using namespace std;
// Declares priority_queues with default deque base container
priority_queue <int> q1, s2;
q1.push(1);
if (q1.empty())
cout << "The priority_queue q1 is empty." << endl;
else
cout << "The priority_queue q1 is not empty." << endl;
if (s2.empty())
cout << "The priority_queue s2 is empty." << endl;
else
cout << "The priority_queue s2 is not empty." << endl;
}
The priority_queue q1 is not empty.
The priority_queue s2 is empty.
priority_queue::pop
從頂端位置移除 priority_queue 的最大項目。
void pop();
備註
使用 必須 priority_queue 是非空的,才能使用此成員函式。 容器 priority_queue 頂部總是裝著容器中最大的元素。
範例:彈跳元素與檢查尺寸
// compile with: /EHsc
#include <queue>
#include <iostream>
int main()
{
using namespace std;
priority_queue <int> q1, s2;
q1.push(10);
q1.push(20);
q1.push(30);
priority_queue <int>::size_type i, iii;
i = q1.size();
cout << "The priority_queue length is " << i << "." << endl;
const int& ii = q1.top();
cout << "The element at the top of the priority_queue is " << ii << "." << endl;
q1.pop();
iii = q1.size();
cout << "After a pop, the priority_queue length is " << iii << "." << endl;
const int& iv = q1.top();
cout << "After a pop, the element at the top of the " << "priority_queue is " << iv << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
After a pop, the priority_queue length is 2.
After a pop, the element at the top of the priority_queue is 20.
priority_queue::priority_queue
建立 priority_queue 一個空的 ,或是從基底容器物件 priority_queue或其他物件複製一個範圍。
priority_queue();
explicit priority_queue(const Traits& _comp);
priority_queue(const Traits& _comp, const container_type& _Cont);
priority_queue(const priority_queue& right);
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last);
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Traits& _comp);
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Traits& _comp, const container_type& _Cont);
參數
_comp
型別的 constTraits 比較函式,用來排序 中的 priority_queue專案,預設為比較基底容器的函式。
_Cont
建構 priority_queue 的基底容器是複本。
right
priority_queue建構集為複本的 。
first
要複製的元素範圍中第一個元素的位置。
last
超出要複製之元素範圍的第一個元素的位置。
備註
前三個建構函式中的每一個都會指定空的初始 priority_queue,第二個建構函式也會指定要用於建立元素順序的比較函comp式類型,以及第三個明確指定 container_type 要使用的 (_Cont)。 關鍵字 explicit 會隱藏某些類型的自動類型轉換。
第四個建構函式會指定的 priority_queue right複本。
最後三個建構函式會複製一些容器的範圍 [first, last) ,並使用 值來初始化 priority_queue ,並在指定 類別 Traits 和 container_type的比較函式類型時越來越明確。
範例:使用自訂容器和比較器
// compile with: /EHsc
#include <queue>
#include <vector>
#include <deque>
#include <list>
#include <iostream>
int main()
{
using namespace std;
// Declares a priority_queue with a default vector base container
priority_queue <int> q1;
cout << "q1 = ( ";
while (!q1.empty())
{
cout << q1.top() << " ";
q1.pop();
}
cout << ")" << endl;
// Declares a priority_queue with nondefault deque base container
priority_queue <int, deque <int>> q2;
q2.push(5);
q2.push(15);
q2.push(10);
cout << "q2 = ( ";
while (!q2.empty())
{
cout << q2.top() << " ";
q2.pop();
}
cout << ")" << endl;
cout << "After printing, q2 has " << q2.size() << " elements." << endl;
// Declares a priority_queue with a vector base container and specifies that
// the comparison function greater is to be used for ordering elements
priority_queue <int, vector<int>, greater<int>> q3;
q3.push(2);
q3.push(1);
q3.push(3);
cout << "q3 = ( ";
while (!q3.empty())
{
cout << q3.top() << " ";
q3.pop();
}
cout << ")" << endl;
// Declares a priority_queue and initializes it with elements copied from another
// container by first inserting elements into q1 and then copying q1 elements into q4
q1.push(100);
q1.push(200);
priority_queue <int> q4(q1);
cout << "q4 = ( ";
while (!q4.empty())
{
cout << q4.top() << " ";
q4.pop();
}
cout << ")" << endl;
// Creates an auxiliary vector object v5 to be used to initialize q5
vector <int> v5;
vector <int>::iterator v5_Iter;
v5.push_back(10);
v5.push_back(30);
v5.push_back(20);
cout << "v5 = ( " ;
for (v5_Iter = v5.begin() ; v5_Iter != v5.end() ; v5_Iter++)
{
cout << *v5_Iter << " ";
}
cout << ")" << endl;
// Declares and initializes a priority_queue q5 by copying the
// range v5[ first, last) from vector v5
priority_queue <int> q5(v5.begin(), v5.begin() + 2);
cout << "q5 = ( ";
while (!q5.empty())
{
cout << q5.top() << " ";
q5.pop();
}
cout << ")" << endl;
// Declares a priority_queue q6 with a comparison function greater and
// initializes q6 by copying the range v5[ first, last) from vector v5
priority_queue <int, vector<int>, greater<int>> q6(v5.begin(), v5.begin() + 2);
cout << "q6 = ( ";
while (!q6.empty())
{
cout << q6.top() << " ";
q6.pop();
}
cout << ")" << endl;
}
priority_queue::push
根據專案的 operator<優先順序,將專案加入至優先順序佇列。
void push(const Type& val);
參數
val
要加到 priority_queue的元素。
備註
容器 priority_queue 頂部包含容器中最大的元素。
舉例:Push 元素並閱讀頂部
// compile with: /EHsc
#include <queue>
#include <iostream>
int main()
{
using namespace std;
priority_queue<int> q1;
q1.push(10);
q1.push(30);
q1.push(20);
priority_queue<int>::size_type i;
i = q1.size();
cout << "The priority_queue length is " << i << "." << endl;
const int& ii = q1.top();
cout << "The element at the top of the priority_queue is " << ii << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
priority_queue::size
傳回 priority_queue 中項目的數目。
size_type size() const;
傳回值
的目前長度 priority_queue。
範例:取得 元素數量 priority_queue
// compile with: /EHsc
#include <queue>
#include <iostream>
int main()
{
using namespace std;
priority_queue <int> q1, q2;
priority_queue <int>::size_type i;
q1.push(1);
i = q1.size();
cout << "The priority_queue length is " << i << "." << endl;
q1.push(2);
i = q1.size();
cout << "The priority_queue length is now " << i << "." << endl;
}
The priority_queue length is 1.
The priority_queue length is now 2.
priority_queue::size_type
一個無符號整數型別,代表 中 priority_queue元素的數量。
typedef typename Container::size_type size_type;
備註
這種類型是其所適應的基礎容器priority_queue的size_type同義詞。
範例:存取頂層元素
關於如何宣告與使用 size_type的範例,請參見「取得元素數量」
priority_queue::top
傳回 priority_queue 頂端最大項目的 const 參考。
const_reference top() const;
傳回值
由函式所Traitspriority_queue決定之最大項目的參考。
備註
使用 必須 priority_queue 是非空的,才能使用此成員函式。
範例:取得 priority_queue
// compile with: /EHsc
#include <queue>
#include <iostream>
int main()
{
using namespace std;
priority_queue<int> q1;
q1.push(10);
q1.push(30);
q1.push(20);
priority_queue<int>::size_type i;
i = q1.size();
cout << "The priority_queue length is " << i << "." << endl;
const int& ii = q1.top();
cout << "The element at the top of the priority_queue is " << ii << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
priority_queue::value_type
此類型代表儲存為 priority_queue 項目的物件類型。
typedef typename Container::value_type value_type;
備註
這種類型是其所適應的基礎容器priority_queue的value_type同義詞。
範例:使用 priority_queue value_type 別名
// compile with: /EHsc
#include <queue>
#include <iostream>
int main()
{
using namespace std;
// Declares priority_queues with default deque base container
priority_queue<int>::value_type AnInt;
AnInt = 69;
cout << "The value_type is AnInt = " << AnInt << endl;
priority_queue<int> q1;
q1.push(AnInt);
cout << "The element at the top of the priority_queue is " << q1.top() << "." << endl;
}
The value_type is AnInt = 69
The element at the top of the priority_queue is 69.
範例:使用使用者定義的資料型別
若要搭配使用者定義的類型元素使用 priority_queue ,您必須提供比較元素的方式。 你可以為你的型別定義 operator< ,或提供自訂的比較函數物件。
以下範例展示了 priority_queue 一個依 Task 優先順序儲存物件的 。 優先權較高的任務會排在隊列頂端。
// compile with: /EHsc
#include <queue>
#include <iostream>
#include <string>
struct Task
{
int priority;
std::string name;
// Define operator< for priority_queue ordering
// Returns true if this task has LOWER priority than other
// (priority_queue puts the "largest" element at the top)
bool operator<(const Task& other) const
{
return priority < other.priority;
}
};
int main()
{
std::priority_queue<Task> tasks;
tasks.push({3, "Low priority task"});
tasks.push({10, "High priority task"});
tasks.push({5, "Medium priority task"});
std::cout << "Processing tasks by priority:\n";
while (!tasks.empty())
{
const Task& t = tasks.top();
std::cout << " Priority " << t.priority << ": " << t.name << "\n";
tasks.pop();
}
}
Processing tasks by priority:
Priority 10: High priority task
Priority 5: Medium priority task
Priority 3: Low priority task
備註
如果你想要不同的排序(例如先降低數值),可以提供自訂比較器:
struct ComparePriority
{
bool operator()(const Task& a, const Task& b)
{
return a.priority > b.priority; // Lower priority value means higher priority
}
};
std::priority_queue<Task, std::vector<Task>, ComparePriority> minQueue;