std::priority_queue
<queue>
ios
一、第一個
元素始終爲最大
元素。less
二、有着相似於堆的特性,它能夠在其中隨時插入元素。函數
三、支持下標訪問
(隨機訪問迭代器)優化
優先隊列內部的實現須要依賴
基礎容器
,該容器應可經過隨機訪問迭代器
訪問,並須要支持如下操做spa
empty( )
code
size( )
blog
front( )
隊列
push_back( )
內存
pop_back( )
string
顯而易見的是有deque
和vector
這兩個基礎容器支持以上操做
因此在默認狀況下,若是未爲priority_queue
指定基礎容器類,則將使用vector
。
(constructor) | Construct priority queue (public member function ) |
---|---|
empty | 優先隊列是否爲空 |
size | 返回優先隊列的當前元素個數 |
top | 訪問頂部元素(返回頂部元素的常量引用) |
push | 插入一個元素 |
pop | 刪除頂部元素 |
emplace | 構造並插入一個元素 |
void swap (priority_queue& x) | 交換兩個隊列的內容 |
注:
一、emplace 與 push 相比更加優化了對內存空間的使用,具體能夠另行查詢
二、swap 是交換兩個同一類型的優先隊列內的全部元素,如a.swap ( x )
即交換隊列 a 和 x 的全部元素
<queue> /* 1 */ priority_queue<int> pq1; //默認大根堆且默認基礎容器爲vector /* 2 */ priority_queue<vector<int>, less<int> > pq2; //與 1 的性質如出一轍 /* 3 */ priority_queue<deque<int>, greater<int> > pq3; //小根堆且基礎容器爲deque
注意:大根堆爲
less
,小根堆爲greater
。
#include <iostream> #include <queue> using namespace std; int main ( void ) { priority_queue<int> pq; //大根堆,默認降序(大的在前,小的在後) pq.push ( 60 ); pq.push ( 20 ); pq.push ( 40 ); pq.push ( 1 ); pq.push ( 25 ); while ( !pq.empty() ) // pq不爲空則循環 { cout << pq.top() << " "; //添加新元素 pq.pop(); //彈出頭元素 } return 0; }
#include <iostream> #include <queue> using namespace std; int main ( void ) { priority_queue<string> pq; //大根堆,默認降序(大的在前,小的在後) pq.push ( "abc" ); pq.push ( "abd" ); pq.push ( "acd" ); pq.push ( "cda" ); pq.push ( "abcd" ); while ( !pq.empty() ) // pq不爲空則循環 { cout << pq.top() << endl; //添加新元素 pq.pop(); //彈出頭元素 } return 0; }
輸出按字典序
#include <iostream> #include <queue> using namespace std; int main ( void ) { priority_queue<int, vector<int>, greater<int> > pq1; //小根堆,默認降序(小的在前,大的在後) pq1.emplace ( 5 ); pq1.emplace ( 4 ); pq1.emplace ( 3 ); pq1.emplace ( 2 ); pq1.emplace ( 1 ); priority_queue<int, vector<int>, greater<int> > pq2; pq2.emplace ( 5 * 2 ); pq2.emplace ( 4 * 2 ); pq2.emplace ( 3 * 2 ); pq2.emplace ( 2 * 2 ); pq2.emplace ( 1 * 2 ); cout << "pq1:" << endl; while ( !pq1.empty() ) // pq不爲空則循環 { cout << pq1.top() << " "; //添加新元素 pq1.pop(); //彈出頭元素 } cout << endl << "pq2:" << endl; while ( !pq2.empty() ) // pq不爲空則循環 { cout << pq2.top() << " "; //添加新元素 pq2.pop(); //彈出頭元素 } cout << endl; return 0; }
swap
高效地清空隊列void clear( priority_queue<int> &pq ) { priority_queue<int> empty; pq.swap ( empty ); }