Priority_Queue(優先隊列)

咱們都知道,隊列是一種FIFO的數據結構,規定在隊尾增長元素,在隊首刪除元素,和食堂排隊打飯一個道理。(固然,插隊的人是很鄙視的)。而在優先隊列中,每一個元素卻有了特權,被賦予了優先級,從而在訪問元素時,優先級高的最早出隊(若有特權的軍人則能夠率先購票,就是這個道理)。node

對PQ的操做有Search,Insert和Delete。在最小優先隊列(min priorIty queue)中,查找用來搜索優先權最小的元素,刪處即刪處該元素,反之,最大優先隊列(max priority queue)中,查找優先權最大的元素,刪除即刪處該元素。ios

基本操做:empty() 判空、pop()刪處第一個元素、push()增長元素、size()返回元素個數,top()返回優先級最高的元素。數據結構

PQ的特徵:priority_queue<int,vector<int>,cmp > que;第一個參數爲數據類型,第二個爲容器類型,第三個爲比較類型。less

接下來是構造PQ,構造好了才能夠用它。函數

priority_queue<int> que; 這裏構造int型數據類型,默認優先級(最大值優先) spa

若是咱們要最小值優先的話,能夠有4種優先級控制方法。code

  • C++中庫函數<functional>

 <functional> 首先頭文件包含#inclu<functional> 而functional提供了基於模板的比較函數對象、對象

     equal_to<Type>  等於blog

     not_equal_to<Type 不等於排序

     greater<Type>大於

     greater_equal<Type>大於等於

     less<Type> 小於

     less_equal<Type>小於等於

構造:

priority_queue<int,vector<int>,less<int> >que1;//最大值優先
priority_queue<int,vector<int>,greater <int> >que2;//最小值遊優先
  • 自定義1(隊列元素爲數值型)
struct cmp1
{
    bool operator ()(int &a,int &b)
    {
       return a < b;//最大值優先  
    }     
};
struct cmp2
{
    bool operator() (int &a,int &b)
    {
     return a > b;//最小值優先
    }            
};
//構造
priority_queue<int,vector<int>,cmp1>que1;//最大值優先
priority_queue<int,vector<int>,cmp2>que2;//最小值優先
  • 自定義2(隊列元素爲結構體型)
struct node1
{ 
    int x,y;
    bool operator < (const node1 &a) const
    {
         return x<a.x;//最大值優先    
    }      
};    
struct node2
{ 
    int x,y;
    bool operator < (const node2 &a) const
    {
         return x>a.x;//最小值優先    
    }      
};    
//構造
priority_queue<node1>que1;
priority_queue<node2>que2;
  • 自定義3(隊列元素爲結構體型)
struct node1
{
    int x;
    int y;
};
bool operator < (const node1 &a,const node1 &b)
{
     return a.x <b.x;//按成員x最大值優先  
}
struct node2
{
    int x;
    int y;
};
bool operator < (const node2 &a,const node2 &b)
{
     return a.y > b.y;//按成員y最小值優先  
}
//構造
priority_queue<node1>que1;
priority_queue<node2>que2;
  • Code
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct Stud
{
    int no;
    string name;
    Stud(int no1,string name1)
    {
        no = no1;
        name = name1;
    }
    bool operator < (const Stud & s)const
    {
        return no < s.no;
    }
    bool operator > (const Stud & s)const
    {
        return no > s.no;
    }
};
struct Cmp
{
    bool operator()(const Stud &s,const Stud &t)const
    {
        return s.name < t.name;//name越大越優先
    }
};
int main()
{
    Stud a[] = {Stud(2,"Mary"),Stud(1,"John"),Stud(5,"Smith")};
    int n  = sizeof(a) / sizeof(a[0]);
    //使用Stud結構體中的《 關係定義pq1
    priority_queue<Stud>pq1(a,a+n);
    cout<<"pq1: ";
    while(! pq1.empty())//no遞減輸出
    {
        cout<<"["<<pq1.top().no<<","<<pq1.top().name<<"]"<<endl;
        pq1.pop();
    }
    //使用Stud結構體的》 關係定義pq2
    priority_queue<Stud,deque<Stud>,greater<Stud> >pq2(a,a+n);
    cout<<"pq2:";
     while(! pq2.empty())//no遞增輸出
    {
        cout<<"["<<pq2.top().no<<","<<pq2.top().name<<"]"<<endl;
        pq2.pop();
    }

   //使用Stud結構體的StudCmp定義pq3
    priority_queue<Stud,deque<Stud>,Cmp>pq3(a,a+n);
    cout<<"pq3:";
    while(! pq3.empty())//name遞減輸出
    {
        cout<<"["<<pq3.top().no<<","<<pq3.top().name<<"]"<<endl;
        pq3.pop();
    }
    return 0;
}
  • 運行結果

 

  • 注意事項 

 有時暈的地方。在對內置數據類型的排序處理中,sort()默認是用less<T>做爲對函數實現遞增排序,如(sort(iterator.begin(),iteraotr.emd(),less<Data_Type>) 等同於sort(iterator.begin(),iterator,end())

而在結構體排序中,默認less<T>,但也要重載<運算符,也可改變排列順序 。如

struct Stud
{
    int no;
    string name;
    Stud(int no1,string name1)
    {
        no = no1;
        name = name1;
    }
    bool operator < (const Stud &s )const//重載 <
    {
        return no > s.no;//用於將no 遞減排序,將>改成 < 爲增序
    }
};
struct Cmp
{
    bool operator() (const Stud &s1,const Stud &s2) const
    {
        return s1.name<s2.name;//將name遞增排序
    }
};
相關文章
相關標籤/搜索