1. 程式人生 > >[queue] c++優先佇列(priority_queue)用法詳解

[queue] c++優先佇列(priority_queue)用法詳解

要包含標頭檔案#include <queue>

優先佇列具有佇列的所有特性,包括基本操作,只是在這基礎上添加了內部的一個排序,它本質是一個堆實現的  定義:priority_queue<Type, Container, Functional> Type 就是資料型別,Container 就是容器型別(Container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。STL裡面預設用的是vector),Functional 就是比較的方式,當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大頂堆  一般是:

//升序佇列
priority_queue <int,vector<int>,greater<int> > q;
//降序佇列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std實現的兩個仿函式(就是使一個類的使用看上去像一個函式。其實現就是類中實現一個operator(),這個類就有了類似函式的行為,就是一個仿函式類了)
  1. 基本型別例子:
    #include<iostream>
    #include <queue>
    using namespace std;
    int main() 
    {
        //對於基礎型別 預設是大頂堆
        priority_queue<int> a; 
        //等同於 priority_queue<int, vector<int>, less<int> > a;
    
        //             這裡一定要有空格,不然成了右移運算子↓
        priority_queue<int, vector<int>, greater<int> > c;  //這樣就是小頂堆
        priority_queue<string> b;
    
        for (int i = 0; i < 5; i++) 
        {
            a.push(i);
            c.push(i);
        }
        while (!a.empty()) 
        {
            cout << a.top() << ' ';
            a.pop();
        } 
        cout << endl;
    
        while (!c.empty()) 
        {
            cout << c.top() << ' ';
            c.pop();
        }
        cout << endl;
    
        b.push("abc");
        b.push("abcd");
        b.push("cbd");
        while (!b.empty()) 
        {
            cout << b.top() << ' ';
            b.pop();
        } 
        cout << endl;
        return 0;
    }

    輸出

    4 3 2 1 0
    0 1 2 3 4
    cbd abcd abc