優先隊列 priority_queue
優先隊列是容器適配器的一種類型,特別設計爲它的第一個元素總是它包含的元素中最大的元素,根據一些嚴格的弱順序標準。
這個上下文類似於堆,在堆中可以隨時插入元素,並且只能檢索最大堆元素(優先級隊列頂部的元素)。
優先級隊列被實現爲容器適配器,這些適配器類使用特定容器類的封裝對象作爲其底層容器,提供一組特定的成員函數來訪問其元素。元素從特定容器的“後面”彈出,該容器稱爲優先級隊列的頂部。
底層容器可以是任何標準容器類模板,也可以是其他特定設計的容器類。容器應通過隨機訪問迭代器訪問,並支持以下操作:
- empty() 如果優先隊列爲空,則返回真
- pop() 刪除第一個元素
- push() 加入一個元素
- size() 返回優先隊列中擁有的元素的個數
- top() 返回優先隊列中有最高優先級的元素
標準容器類vector和deque滿足這些需求。默認情況下,如果沒有爲特定的priority_queue類實例化指定容器類,則使用標準容器向量。
任何時候都需要支持隨機訪問迭代器,以便在內部保持堆結構。這是由容器適配器通過在需要時自動調用算法函數make_heap、push_heap和pop_heap來自動完成的。
大頂堆:
priority_queue<int> q;
for( int i= 0; i< 10; ++i ) q.push(i);
while( !q.empty() ){
cout<<q.top()<<endl;
q.pop();
}
小頂堆
priority_queue<int, vector<int>, greater<int> > q;
for( int i= 0; i< 10; ++i ) q.push(10-i);
while( !q.empty() ){
cout << q.top() << endl;
q.pop();
}