std::priority_queue
<queue>
優先隊列
1、第一個元素始終為最大元素。
2、有着類似於堆的特性,它可以在其中隨時插入元素。
3、支持下標訪問(隨機訪問迭代器)
優先隊列內部的實現需要依賴
基礎容器,該容器應可通過隨機訪問迭代器訪問,並需要支持以下操作
-
empty( ) -
size( ) -
front( ) -
push_back( ) -
pop_back( )
顯而易見的是有deque和vector這兩個基礎容器支持以上操作
所以在默認情況下,如果未為priority_queue指定基礎容器類,則將使用vector。
成員函數
| (constructor) | Construct priority queue (public member function ) |
|---|---|
| empty | 優先隊列是否為空 |
| size | 返回優先隊列的當前元素個數 |
| top | 訪問頂部元素(返回頂部元素的常量引用) |
| push | 插入一個元素 |
| pop | 刪除頂部元素 |
| emplace | 構造並插入一個元素 |
| void swap (priority_queue& x) | 交換兩個隊列的內容 |
注:
1、emplace 與 push 相比更加優化了對內存空間的使用,具體可以另行查詢
2、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。
函數成員用例
1、push、top、empty、pop、大根堆
(1)int
#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;
}

(2)string
#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;
}
輸出按字典序
2、swap、emplace、小根堆
(1)輸入輸出
#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;
}

(2)利用swap高效地清空隊列
void clear( priority_queue<int> &pq ) {
priority_queue<int> empty;
pq.swap ( empty );
}
(3)利用=高效地清空隊列
void clear( priority_queue<int> &pq ) {
priority_queue<int> t;
pq = t;
}

