优先队列
优先队列是一种抽象数据类型(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;
}
(如有错误,欢迎指正,转载请注明出处)