日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

priority_queue(优先队列)的简单构造与用法

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 priority_queue(优先队列)的简单构造与用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??

priority_queue

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

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

一、基本數據類型的優先級設置

  • 此處指的基本數據類型就是 int 型,double 型,char 型等可以直接使用的數據類型,優先隊列對他們的優先級設置一般是數字大的優先級高,因此隊首元素就是優先隊列內元素最大的那個(如果是 char 型,則是字典序最大的)。
  • //下面兩種優先隊列的定義是等價的priority_queue<int> q;priority_queue<int,vector<int>,less<int> >;//后面有一個空格

      其中第二個參數( vector ),是來承載底層數據結構堆的容器,第三個參數( less ),則是一個比較類,less 表示數字大的優先級高,而 greater 表示數字小的優先級高

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

    priority_queue<int,vector<int>,greater<int> >q;

    示例代碼:

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

    示例代碼:

    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:100Tom:90Jerry:80*/

    2.方式二:把重載的函數寫在結構體外面

      將比較函數寫在結構體外面,作為參數傳給優先隊列。

    struct fruit{string name;int price;};struct cmp{// "<" 表示 price 大的優先級高bool operator() (fruit f1,fruit f2){return f1.price < f2.price;}};

    示例代碼:

    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:7banana:6apple:5*/

    ??


    原博客鏈接:https://blog.csdn.net/pzhu_cg_csdn/article/details/79166858

    總結

    以上是生活随笔為你收集整理的priority_queue(优先队列)的简单构造与用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。