priority_queue

priority_queue
  priority_queue 優先隊列,其底層是用堆來實現的。在優先隊列中,隊首元素一定是當前隊列中優先級最高的那一個。

  在優先隊列中,沒有 front() 函數與 back() 函數,而只能通過 top() 函數來訪問隊首元素(也可稱爲堆頂元素),也就是優先級最高的元素。

一、基本數據類型的優先級設置
此處指的基本數據類型就是 int 型,double 型,char 型等可以直接使用的數據類型,優先隊列對他們的優先級設置一般是數字大的優先級高,因此隊首元素就是優先隊列內元素最大的那個(如果是 char 型,則是字典序最大的)。

  //下面兩種優先隊列的定義是等價的
    priority_queue<int> q;
    priority_queue<int,vector<int>,less<int> >;//後面有一個空格
1
2
3
4
5
  其中第二個參數( vector ),是來承載底層數據結構堆的容器,第三個參數( less ),則是一個比較類,less 表示數字大的優先級高,而 greater 表示數字小的優先級高。

如果想讓優先隊列總是把最小的元素放在隊首,只需進行如下的定義:


    priority_queue<int,vector<int>,greater<int> >q;
1
2
3
示例代碼:


    void test1(){
        //默認情況下,數值大的在隊首位置(降序)
        priority_queue<int> q;
        for(int i  = 0;i <= 10;i ++)
            q.push(i);
        while(!q.empty()){
            cout<<q.top()<<" ";
            q.pop();
        }
        cout<<endl;

        //greater<int>表示數值小的優先級越大
        priority_queue<int,vector<int>,greater<int> > Q;
        for(int i  = 0;i <= 10;i ++)
            Q.push(i);
        while(!Q.empty()){
            cout<<Q.top()<<" ";
            Q.pop();
        }

    }

二、結構體的優先級設置
1.方式一:重載運算符 ‘<’
  可以在結構體內部重載 ‘<’,改變小於號的功能(例如把他重載爲大於號)

 struct student{
        int grade;
        string name;

        //重載運算符,grade 值高的優先級大
        friend operator < (student s1,student s2){
            return s1.grade < s2.grade;
        }
    };
1
2
3
4
5
6
7
8
9
10
11
示例代碼:


    void test2(){
        priority_queue<student> q;
        student s1,s2,s3;
        s1.grade = 90;
        s1.name = "Tom";

        s2.grade = 80;
        s2.name = "Jerry";

        s3.grade = 100;
        s3.name = "Kevin";

        q.push(s1);
        q.push(s2);
        q.push(s3);

        while(!q.empty()){
            cout<<q.top().name<<":"<<q.top().grade<<endl;
            q.pop();
        } 

    }
        /*
         結果:
            Kevin:100
            Tom:90
            Jerry:80
        */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2.方式二:把重載的函數寫在結構體外面
  將比較函數寫在結構體外面,作爲參數傳給優先隊列。


    struct fruit{
        string name;
        int price;
    };
    struct cmp{
        // "<" 表示 price 大的優先級高
        bool operator() (fruit f1,fruit f2){
            return f1.price < f2.price;
        }
    };
1
2
3
4
5
6
7
8
9
10
11
12
示例代碼:


    void test3(){
        priority_queue<fruit,vector<fruit>,cmp> q;
        fruit f1,f2,f3;

        f1.name = "apple";
        f1.price = 5;

        f2.name = "banana";
        f2.price = 6;

        f3.name = "pear";
        f3.price = 7;

        q.push(f1);
        q.push(f2);
        q.push(f3);

        while(!q.empty()){
            cout<<q.top().name<<":"<<q.top().price<<endl;
            q.pop();
        }
    }

    /*
     結果:
           pear:7
           banana:6
           apple:5
    */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章