特点
- queue:先进先出
- priority_queue:先进先出,不过可以定义排序优先级。
成员函数
队列:
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
优先队列:
back()返回最后一个元素
empty()如果队列空则返回真
top()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
注意
对于优先队列的定义,有两种方式。
priority_queue<Example> pq1;
priority_queue<int,vector<int>,less<int>>q2;//神奇的降序
priority_queue<Example2,vector<Example2>, cmp> pq2;
这里解释以下priority_queue<int,vector,greater>q的形式。
大家可以看到,默认模板有三个参数,第一个是优先队列处理的类。第二个参数比较有特点,是容纳优先队列的容器。实际上,优先队列是由这个容器C++语言中关于heap的相关操作实现的。这个容器默认是vector,也可以是dequeue,因为后者功能更强大,而性能相对于vector较差,考虑到包装在优先队列后,后者功能并不能很好发挥,所以一般选择vector来做这个容器。第三个参数比较重要,支持一个比较结构,默认是less,默认情况下,会选择第一个参数决定的类的<运算符来做这个比较函数。
接下来开始坑爹了,虽然用的是less结构,然而,队列的出队顺序却是greater的先出,即降序!就是说,这里这个参数其实很傲娇,表示的意思是如果!cmp,则先出列,不管这样实现的目的是啥,大家只能接受这个实现。
一般对于单维的数据,我们可以直接用greater<类>(升序),或less<类>(降序)的方式去实现优先队列的优先级定义。对于多维,有类自排序,和定义比较函数cmp的方式来进行操作。很一致的是,对于多维定义的比较函数,优先队列依然处理的方式是!cmp 即你定义的是升序,它会排成降序。
代码展示
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>
#include<math.h>
#include<set>
#include<list>
#include<string>
#include<random>
#define maxn 50
using namespace std;
struct Example{
int x,y;
bool operator <(const Example & a) const
{
if(x==a.x)
return a.y<y;//升序排序
return x<a.x;//降序排序
}
};
struct Example2{
int x,y;
};
struct cmp{
bool operator () (const Example2 &a,const Example2 &b)const
{
if(b.x==a.x)
return a.y<b.y;//降序排序
return b.x<a.x;//升序排序
}
};
void init( queue<int>& q)
{
default_random_engine e;
uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
cout<<"初始化给queue值:";
for(int i=0; i<10; ++i)
{
int value=u(e);
cout<<value<<" ";
q.push(value);
}
cout<<endl;
}
void output(queue<int> q)
{
cout<<"输出queue:"<<endl;
while(!q.empty())
{
cout<<q.front()<<" ";
q.pop();
}
cout<<endl;
}
void init1(priority_queue<int,vector<int>,greater<int> >&q)
{
default_random_engine e;
uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
cout<<"初始化给priority_queue值:";
for(int i=0; i<10; ++i)
{
int value=u(e);
cout<<value<<" ";
q.push(value);
}
cout<<endl;
}
void output1( priority_queue<int,vector<int>,greater<int> >q)
{
cout<<"输出priority_queue(great<int>):"<<endl;
while(!q.empty())
{
cout<<q.top()<<" ";
q.pop();
}
cout<<endl;
}
void init2( priority_queue<Example>& q)
{
default_random_engine e;
uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
cout<<"初始化给优先队列值:";
for(int i=0; i<10; ++i)
{
int valueX=u(e);
int valueY=u(e);
cout<<valueX<<","<<valueY<<" ";
q.push({
valueX,valueY});
}
cout<<endl;
}
void output2(priority_queue<Example> q)
{
cout<<"输出priority_queue (类自带排序):"<<endl;
while(!q.empty())
{
cout<<q.top().x<<","<<q.top().y<<" ";
q.pop();
}
cout<<endl;
}
void init3( priority_queue<Example2,vector<Example2>, cmp> & q)
{
default_random_engine e;
uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
cout<<"初始化给priority_queue值:";
for(int i=0; i<10; ++i)
{
int valueX=u(e);
int valueY=u(e);
cout<<valueX<<","<<valueY<<" ";
q.push({
valueX,valueY});
}
cout<<endl;
}
void output3(priority_queue<Example2,vector<Example2>, cmp> q)
{
cout<<"输出优先队列(自定义cmp):"<<endl;
while(!q.empty())
{
cout<<q.top().x<<","<<q.top().y<<" ";
q.pop();
}
cout<<endl;
}
int main()
{
queue<int> q1;
init(q1);
output(q1);
cout<<"最后一个元素:"<<q1.back()<<endl;
cout<<"queue的大小:"<<q1.size()<<endl;
priority_queue<int,vector<int>,greater<int>>q2;//神奇的升序。 less<int> 神奇的降序
init1(q2);
output1(q2);
priority_queue<Example> pq1;
init2(pq1);
output2(pq1);
priority_queue<Example2,vector<Example2>, cmp> pq2;
init3(pq2);
output3(pq2);
return 0;
}
结果展示:
再提一点:
随机数参考:c++ 11 random库的简单用法
参考:优先队列