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

浙公网安备 33010602011771号