priority_queue
priority_queue就是一个堆,并且默认情况下位大根堆。
函数 | 描述 by MoreWindows( http://blog.csdn.net/MoreWindows ) |
构造析构 | |
priority_queue <Elem> c | 创建一个空的queue 。 注:priority_queue构造函数有7个版本,请查阅MSDN |
数据访问与增减 | |
c.top() | 返回队列头部数据 |
c.push(elem) | 在队列尾部增加elem数据 |
c.pop() | 队列头部数据出队 |
其它操作 | |
c.empty() | 判断队列是否为空 |
c.size() |
返回队列中数据的个数 |
可以看出priority_queue的函数列表与栈stack的函数列表是相同的。
priority_queue优先队列,插入进去的元素都会从大到小排好序
PS:在priority_queue<ll, vector<ll>, greater<ll> > pq;中
第一个参数为数据类型,第二个参数为保存数据的容器(默认为vector<int>),第三个参数为元素比较函数(默认为less)。
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。
更多细节看实例吧:
1 #include <bits/stdc++.h> 2 using namespace std; 3 priority_queue<int> q1; 4 priority_queue<int,vector<int>,greater<int> > q2; 5 priority_queue<int,vector<int>,less<int> > q3;//默认为less,是大根堆 6 7 struct node{ 8 int a; 9 int b; 10 node(int a,int b){ 11 this->a=a; 12 this->b=b; 13 } 14 }; 15 struct myCmp{ 16 bool operator ()(const node &p1,const node &p2){//这里是取引用 ,而且这里重载的是括号而不是<号 17 return p1.a<p2.a; 18 } 19 }; 20 21 priority_queue<node,vector<node>,myCmp > q4; 22 23 int main(){ 24 int a[7]={1,9,5,7,8,11,4}; 25 26 for(int i=0;i<7;i++) q1.push(a[i]); 27 cout<<q1.top()<<endl;//输出为11,所以默认为大根堆 28 29 for(int i=0;i<7;i++) q2.push(a[i]); 30 cout<<q2.top()<<endl;//输出为1,说明greater加持之后变成了小根堆 31 32 for(int i=0;i<7;i++) q3.push(a[i]); 33 cout<<q3.top()<<endl;//输出为11,说明是大根堆,默认就为less 34 35 int h[3][2]={{1,3},{3,2},{2,1}}; 36 for(int i=0;i<3;i++) { 37 int a=h[i][0]; 38 int b=h[i][1]; 39 q4.push(node(a,b)); 40 } 41 node p=q4.top(); 42 cout<<p.a<<" "<<p.b<<endl;//输出为3 2,说明是按a成员来的大根堆,我定义的时候是定义的小于,也就是相当于less 43 44 return 0; 45 }
时间: 2024-10-10 23:36:54