优先队列的用法



   priority_queue<T, Container, Compare>

    可以看出,创建一个优先队列默认需要三个参数(实际应用上有些参数可以省去)。参数解释:

   T:队列中元素的数据类型

   Container: 用于储存和访问队列元素的底层容器的类型。

   Compare比较关系,默认是数值上的小于关系,比如1<2,6<7,此时队列中元素由队头到队由大到小排列,采用默认compare时此参数可以省去。当需要采用其它标准进行比较时需要额外定义这一比较方式(下例示)。当满足比较关系”<”时,返回true,否则返回false。

 

比较关系与sort有点不同:

         sort是按逻辑顺序比如

bool cmp(int a,int b) {return a<b}     a是否在前看a是否满足a<b;

             priority_queue则是:

         bool operator ()(int a,int b)  {return a<b} 默认b的优先级是大于a的,所以优先级高的要大所以是最大堆。


自定义优先级时可以定义在struct 内指定命名域,而当自定义struct的优先级时,用成员方式重载运算符, 不能改变参数的个数 ,二元运算符用成员重载时, 只需要一个参数, 另一个参数由this指针传入 。如果需要两个参数,那么可以在类外面定义,然后在类里声明为友元。

#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue> 
#include<vector>
#define LL long long 
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 node1    
{      
    int u;      
    bool operator < (const node1 &a) const     
    {      
       return u>a.u;//最小值优先       
    }      
};      
struct node2    
{      
    int u;     
    node2(int a)
    {
    	u=a;
    }
    friend bool operator < (node2 a,node2 b)      //用成员方式重载运算符,   不能改变参数的个数  ,二元运算符用成员重载时,   只需要一个参数,   另一个参数由this指针传入  。如果需要两个
												//参数,那么可以在类外面定义,然后在类里声明为友元。
    {      
        return a.u<b.u;//最大值优先       
    }      
};      
int main()
{

	priority_queue<int> q;						//为less大顶堆 
	priority_queue<int,vector<int>,cmp1 > q1;  //最小堆 
	priority_queue<node2>q2;					//最大堆 
	q2.push(node2(1));
	q2.push(node2(2));
	while(!q2.empty())
	{
		printf("%d ",q2.top().u);
		q2.pop();
	} 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值