C++ priority_queue

C++中优先队列priority_queue实现的是heap的功能,默认是大顶堆。

如果需要自定义排序,需要注意,优先队列中小于和大于都是和正常思考相反的。

#include <iostream>
#include <queue>
#include <cstdio>
#include <functional> // greater函数在里面。
using namespace std;
 
// 默认优先级less,从大到小,大的先出队
priority_queue<int> que1;

// 使用系统比较函数 greater<int> 从小到大的出队
priority_queue<int,vector<int>,greater<int>> que2;

// 自定义优先级
struct cmp1{
    bool operator()(int &a,int &b){
        return a>b; //从小到大,最小值优先。
    }
};
priority_queue<int,vector<int>,cmp1> que3;

// 自定义优先级 lambda function
auto cmp2=[](int a, int b){
  return a>b;  
};
priority_queue<int,vector<int>,decltype(cmp2)> que4(cmp2);

// 结构体的自定义优先级,由于默认是less,我们需要重载<
struct number{
    int x;
    int y;
    bool operator<(const number &a) const{
        if(x == a.x) return y>a.y; // x相等的情况下按y从小到大,最小值优先
        else return x>a.x; // x从小到大,最小值优先
    }
};
priority_queue<number> que5;

int data1[5] = {88,88,56,62,99};
number data2[5]={{88,7},{88,6},{56,5},{62,3},{99,4}};
 
int main()
{
    for(int i=0;i<5;++i) que1.push(data1[i]);
    while(!que1.empty()){
        printf("%d ",que1.top());
        que1.pop();
    }
    // 99 88 88 62 56 
    printf("\n-----------------------------------------------------\n");
 
    for(int i=0;i<5;++i)
        que2.push(data1[i]);
    while(!que2.empty()){
        printf("%d ",que2.top());
        que2.pop();
    }
    // 56 62 88 88 99 
    printf("\n-----------------------------------------------------\n");
 
    for(int i=0;i<5;++i)
        que3.push(data1[i]);
    while(!que3.empty()){
        printf("%d ",que3.top());
        que3.pop();
    }
    // 56 62 88 88 99 
    printf("\n-----------------------------------------------------\n");
    
    for(int i=0;i<5;++i)
        que4.push(data1[i]);
    while(!que4.empty()){
        printf("%d ",que4.top());
        que4.pop();
    }
    // 56 62 88 88 99 
    printf("\n-----------------------------------------------------\n");
 
    for(int i=0;i<5;++i)
        que5.push(data2[i]);
    printf("x  y\n");
    while(!que5.empty()){
        printf("%d %d\n",que5.top().x,que5.top().y);
        que5.pop();
    }
    return 0;
}

 

posted @ 2018-07-17 17:53  約束の空  阅读(239)  评论(0)    收藏  举报