天天看點

算法筆記6.6 priority_queue

priority_queue 優先隊列,隻可以通路隊首元素top(),隻可以pop()隊首元素,可以随意push元素。會自動按照優先級排序。對于基本資料類型,按照數值由小到大(從隊首到隊尾排序)

1.基本方法

#include<iostream>
#include<queue>
using namespace std;

void empty(priority_queue<int> q){
  if(q.empty()){
    cout<<"空\n";
  }else{
    cout<<"非空\n";
  }
}

int main(){
  priority_queue<int> q;
  q.push(3);
  q.push(4);
  q.push(1);

  //4 3 2
  cout<<"隊首:"<<q.top()<<endl;
  q.pop();//3 2
  cout<<"隊首:"<<q.top()<<endl;

  cout<<"長度:"<<q.size()<<endl;
  q.pop();//2
  cout<<"長度:"<<q.size()<<endl;


  empty(q);
  q.pop();//null
  empty(q);

  return 0;
}      
算法筆記6.6 priority_queue

2.設定優先級别

(1)基本資料類型

這兩種方式等價:(預設方式,less表示數字大的優先級大)
 priority_queue<int> q;
 priority_queue<int,vector<int>,less<int> > q;  //優先隊列底層是堆,vector<int>就是承載底層的堆的 數字小的優先級大:
 priority_queue<int,vector<int>,greater<int> > q;      
#include<iostream>
#include<queue>
using namespace std;
int main(){
  priority_queue<int,vector<int>,greater<int> > q;
  q.push(3);
  q.push(4);
  q.push(1);
  cout<<q.top()<<endl;
  return 0;
}      
算法筆記6.6 priority_queue

3.結構體優先級設定(重載<運算符)

寫法1:

#include<iostream>
#include<queue>
using namespace std;

struct fruit{
  string name;
  int price;

  fruit(string name,int price){
    this->name=name;
    this->price=price;
  }

  friend bool operator < (fruit f1,fruit f2){
    return f1.price<f2.price;//大的優先級高 和sort() cmp相反
  }

};

int main(){
  priority_queue<fruit> q;
  fruit f1=fruit("桃子",3);
  fruit f2=fruit("梨子",4);
  fruit f3=fruit("蘋果",1);
  q.push(f1);
  q.push(f2);
  q.push(f3);
  cout<<q.top().name<<" "<<q.top().price<<endl;
  return 0;
}      
算法筆記6.6 priority_queue

寫法2:

#include<iostream>
#include<queue>
using namespace std;

struct fruit{
  string name;
  int price;
  fruit(string name,int price){
    this->name=name;
    this->price=price;
  }

};

struct cmp{
  bool operator() (fruit f1,fruit f2){
    return f1.price>f2.price;//小的優先級别高 
  }
};

int main(){              //指定cmp結構體為比較依據
  priority_queue<fruit,vector<fruit>,cmp> q;
  fruit f1=fruit("桃子",3);
  fruit f2=fruit("梨子",4);
  fruit f3=fruit("蘋果",1);
  q.push(f1);
  q.push(f2);
  q.push(f3);
  cout<<q.top().name<<" "<<q.top().price<<endl;
  return 0;
}      
算法筆記6.6 priority_queue

4.應用

貪心

dijkstra算法優化