C++ STL 優先隊列 (priority_queue)

std::priority_queue

<queue>ios

優先隊列

  一、第一個元素始終爲最大元素。less

  二、有着相似於堆的特性,它能夠在其中隨時插入元素。函數

  三、支持下標訪問(隨機訪問迭代器)優化

優先隊列內部的實現須要依賴基礎容器,該容器應可經過隨機訪問迭代器訪問,並須要支持如下操做spa

  • empty( )code

  • size( )blog

  • front( )隊列

  • push_back( )內存

  • pop_back( ) string

     顯而易見的是有dequevector這兩個基礎容器支持以上操做

     因此在默認狀況下,若是未爲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

函數成員用例

一、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;
}

輸出按字典序

二、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 );
}
相關文章
相關標籤/搜索