STL优先队列详解
优先队列
优先队列是一种抽象数据类型(Abstract Date Type,ADT),行为和队列类似,但是先出队的元素不是先进队列的元素,而是队列中优先级最高的元素。
STL的优先队列定义在头文件<queue>和 (队列一样),用"priority_queue<int>pq"来声明;
最基本的用法
priority_queue<int>pq 默认的是整数越大,优先级越高,如果想让他 整数越小 优先级越高怎么办?
STL中也有模板 “priority_queue<int,vector<int>,greater<int > >pq”
上面的尖括号内第一个参数为入队元素类型(int),第二个为容器类型(vector<int>),第三个为比较函数(greater<int>)
因此我们也能自定义
priority_queue<int,vector<int>,cmp1 >pq; 最小值优先
priority_queue<int,vector<int>,cmp2 >pq2; 最大值优先 (网上有些写法是错的,这是笔者测试后的定义方式)
cmp1,cmp2 在结构体中实现:
STL的优先队列定义在头文件<queue>和 (队列一样),用"priority_queue<int>pq"来声明;
最基本的用法
定义:priority_queue<int>pq;
操作:
pq.empty() 如果队列为空返回真
pq.pop() 删除对顶元素
pq.push() 加入一个元素
pq.size() 返回优先队列中拥有的元素个数
pq.top() 返回优先队列对顶元素
下面我们介绍几种优先队列的定义方式:priority_queue<int>pq 默认的是整数越大,优先级越高,如果想让他 整数越小 优先级越高怎么办?
STL中也有模板 “priority_queue<int,vector<int>,greater<int > >pq”
上面的尖括号内第一个参数为入队元素类型(int),第二个为容器类型(vector<int>),第三个为比较函数(greater<int>)
因此我们也能自定义
priority_queue<int,vector<int>,cmp1 >pq; 最小值优先
priority_queue<int,vector<int>,cmp2 >pq2; 最大值优先 (网上有些写法是错的,这是笔者测试后的定义方式)
cmp1,cmp2 在结构体中实现:
struct cmp1{ bool operator ()(int &a,int &b){ return a>b;//最小值优先 } }; struct cmp2{ bool operator ()(int &a,int &b){ return a<b;//最大值优先 } };
当然,我们也能设置自定义类型的优先级
最后奉上笔者的测试代码:
struct node //自定义类型优先级设定 { friend bool operator< (node n1, node n2)//重载小于号,,不要重载大于号,可能报错 { return n1.priority < n2.priority;// (priority)大的优先级高 } int priority; int value; };
最后奉上笔者的测试代码:
#include <queue> #include <vector> #include <stdio.h> //#include <functional.h> using namespace std; struct cmp1 { bool operator ()(int &a,int &b) { return a>b;//最小值优先 } }; struct cmp2 { bool operator ()(int &a,int &b) { return a<b;//最大值优先 } }; struct node //自定义类型优先级设定 { friend bool operator< (node n1, node n2)//重载小于号,,不要重载大于号,可能报错 { return n1.priority < n2.priority;// (priority)大的优先级高 } int priority; int value; }; int main() { int a[6]={1,5,2,8,6,3}; printf("最大值优先模板:\n"); priority_queue<int>pq0; for(int i=0;i<6;i++) { pq0.push(a[i]); } for(int i=0;i<6;i++) { printf("%d ",pq0.top()); pq0.pop(); } printf("\n"); printf("最大值优先自定义\n"); priority_queue<int,vector<int>,cmp2 >pq2; for(int i=0;i<6;i++) { pq2.push(a[i]); } for(int i=0;i<6;i++) { printf("%d ",pq2.top()); pq2.pop(); } printf("\n"); printf("最小值优先模板:\n"); priority_queue<int,vector<int>,greater<int> >pq3;//注意这里两个> >之间有空格否则编译器会报错g++ for(int i=0;i<6;i++) { pq3.push(a[i]); } for(int i=0;i<6;i++) { printf("%d ",pq3.top()); pq3.pop(); } printf("\n"); priority_queue<int,vector<int>,cmp1 >pq; printf("最小值优先自定义:\n"); for(int i=0;i<6;i++) { pq.push(a[i]); } for(int i=0;i<6;i++) { printf("%d ",pq.top()); pq.pop(); } printf("\n"); printf("自定义类型优先级:\n"); priority_queue<node> pq4; node b[5]; b[0].priority = 6; b[0].value = 1; b[1].priority = 9; b[1].value = 5; b[2].priority = 2; b[2].value = 3; b[3].priority = 8; b[3].value = 2; b[4].priority = 1; b[4].value = 4; for(int i=0;i<5;i++) { pq4.push(b[i]); } printf("优先级 值\n"); for(int i=0;i<5;i++) { printf("%d\t%d\n",pq4.top().priority,pq4.top().value); pq4.pop(); } return 0; }(如有错误,欢迎指正,转载请注明出处)