一、相关定义
优先队列容器和队列一样,只能从队尾插入元素,从队首删除元素。
为什么能叫优先队列呢??因为它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并不是完全一样的遵循先进先出的原则来进行的,而是将队列中最大的元素出队。这点有点儿类似于给队列里元素先进行一个排序,再按照顺序出队。元素的比较规则默认按照元素值由大到小排序,我们可以重载 "<" 操作符来重新定义比较规则。
优先队列可以用容器vector 或双向队列(deque)来实现(特殊情况:list container不能用来实现queue,因为list的迭代器不是任意存取iterator,而pop中所用到的堆排序时要求randomaccess iterator的!!!):
priority_queue
priority_queue
里边还有的函数有:"判空(empty)","大小(size)" , "栈顶元素(top)","入栈(push)","出栈(pop)"等。。。。。
二.基本介绍
基本操作:
empty() 如果队列为空,则返回为真
pop() 删除队顶元素,删除第一个元素
push() 添加 一个元素
size() 返回优先队列中的元素个数
top() 返回优先队列的队顶,即返回优先队列中具有最高级的元素
头文件:#include
声明方式:
1、普通方法:
priority_queue a; //通过操作,按照元素从大到小的顺序出队
priority_queue,greater> b; //通过操作,按照元素从小到大的顺序出队
2、自定义优先级
struct cmp{
operator bool()(int x , int y)
{
return x > y; //x小的优先级高,也可以写成其他方式出队,例如:return a[i] > a[j],这样表示a[i]小的优先
}
};
priority_queue,cmp> s;
//其中,我们传入的第二个参数是容器的类型,第三个参数为重载的比较函数
3、结构体声明方式:
struct node
{
int x , y;
friend bool operator < (node a , node b)
{
return a.x > b.x; //在结构体中,根据x的优先级高的来出队
}
};
priority_queue
// 在该结构体中,y为值,x为优先级,我们可以通过自定义operator< 来操作元素的优先级
//我们在重载 “ < ”的过程中,最好不要重载 " > ",可能会出现错误
#include
#include
#include
#include
using namespace std;
//定义结构,使用运算符重载,自定义优先级1
struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
struct cmp2{
bool operator ()(int &a,int &b){
return aa.x;//最小值优先
}
};
struct number2{
int x;
bool operator < (const number2 &a) const {
return xque;//采用默认优先级构造队列
priority_queue,cmp1>que1;//最小值优先
priority_queue,cmp2>que2;//最大值优先
priority_queue,greater >que3;//注意“>>”会被认为错误,
//这是右移运算符,所以这里用空格号隔开
priority_queue,less >que4;最大值优先
priority_queueque5;
priority_queueque6;
int i;
for(i=0;a[i];i++){
que.push(a[i]);
que1.push(a[i]);
que2.push(a[i]);
que3.push(a[i]);
que4.push(a[i]);
}
for(i=0;num1[i].x;i++)
que5.push(num1[i]);
for(i=0;num2[i].x;i++)
que6.push(num2[i]);
printf("采用默认优先关系:\n(priority_queueque;)\n");
printf("Queue 0:\n");
while(!que.empty()){
printf("%3d",que.top());
que.pop();
}
puts("");
puts("");
printf("采用结构体自定义优先级方式一:\n(priority_queue,cmp>que;)\n");
printf("Queue 1:\n");
while(!que1.empty()){
printf("%3d",que1.top());
que1.pop();
}
puts("");
printf("Queue 2:\n");
while(!que2.empty()){
printf("%3d",que2.top());
que2.pop();
}
puts("");
puts("");
printf("采用头文件\"functional\"内定义优先级:\n(priority_queue,greater/less >que;)\n");
printf("Queue 3:\n");
while(!que3.empty()){
printf("%3d",que3.top());
que3.pop();
}
puts("");
printf("Queue 4:\n");
while(!que4.empty()){
printf("%3d",que4.top());
que4.pop();
}
puts("");
puts("");
printf("采用结构体自定义优先级方式二:\n(priority_queueque)\n");
printf("Queue 5:\n");
while(!que5.empty()){
printf("%3d",que5.top());
que5.pop();
}
puts("");
printf("Queue 6:\n");
while(!que6.empty()){
printf("%3d",que6.top());
que6.pop();
}
puts("");
return 0;
}
运行结果:
原文