前言:在今天写下了我的第一篇blog记一下知识要点(主要是买的书还没有到),回过神来才发现tm身边的小伙伴已经超我一大截了woc。
所以用队列queque时要做 or 注意些什么呢?
一、函数的头文件与申明
首先我们需要这个
#include<queue>
using namespace std;//可以说变身前要做的动作了hhh
具体点
using namespace std; /*这句话,代表,使用一个叫做“std”的namespace,namespace里面封存了一系列东西,比方说奇异的数据结构和奇异的函数。当打开了namespace以后,就跟打开了头文件的本质是一样的,都是可以直接用它里面封存的函数。
不同之处在什么地方?就是不开namespace的使用,在你想用的(以std为例)函数面前加上“std::”即可。
例如,std::sort(a+1,a+1+N); 之类的。*/
有时我们可能会用到优先队列
基本格式是:priority_queue<结构类型>队列名
比如:
priority_queue <int> i;
priority_queue <double> d;
不过最为常见的为这几种
priority_queue <node> q;
//node是一个结构体
//结构体里重载了‘<’小于符号
priority_queue <int,vector<int>,greater<int> > q;
//不需要#include<vector>头文件
//注意后面两个“>”不要写在一起,“>>”是右移运算符
priority_queue <int,vector<int>,less<int> >q;
二、队列基本操作
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。 访问队列中的元素个数,如例:q.size()。
而优先队列的特性为自动排序
默认的优先对列(非结构体结构)
priority_queue <int> q;
嘶,那排序是按怎样的顺序排的呢。
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int> q;
int main()
{
q.push(101),q.push(7),q.push(5),q.push(41),q.push(99);
while(!q.empty()){
printf("%d ",q.top()),q.pop();
return 0;
}
让我们在这个优先队列里依次插入101、7、5、41、99,再输出。
结果 : 101 99 41 7 5
也就是说,它是按降序排列的!
来看看下面这个结构体(重载小于)
struct node
{
int x,y;
bool operator < (const node & a) const{
return x<a.x;
}
};
这个node结构体有两个成员,x和y,它的小于规则是x小者小。
再来看看验证程序:
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int x,y;
bool operator < (const node & a) const{
return x<a.x;
}
}k;
priority_queue <node> q;
int main()
{
t.x=9,t.y=40; q.push(t);
t.x=5,t.y=20; q.push(t);
t.x=9,t.y=26; q.push(k);
t.x=6,t.y=37; q.push(k);
t.x=8,t.y=16; q.push(k);
while(!q.empty())
{
node m=q.top(); q.pop();
printf("(%d,%d) ",m.x,m.y);
}
return 0;
}
大意就是插入(9,40),(5,20),(9,26),(6,37),(8,16)这五个node。
再来看看输出: (9,40) (9,26) (8,16) (6,37) (5,20)
它也是按照重载后的小于规则,从大到小排序的。
这时候就不得不搬出它们了 less和greater优先队列
还是以int为例,先来声明:
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
来
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
int a[5]={5,4,1,3,2};
int main()
{
for(int i=0;i<5;i++) p.push(a[i]),q.push(a[i]);
printf("less<int>:");
while(!p.empty()) printf("%d ",p.top()),p.pop();
printf("\ngreater<int>:");
while(!q.empty()) printf("%d ",q.top()),q.pop();
}
结果: less<int>:5 4 3 2 1 greater<int>:1 2 3 4 5
所以,我们可以知道,less是从大到小,greater是从小到大。