现在的位置: 首页 > 综合 > 正文

STL:priority_queue(优先队列)

2017年04月28日 ⁄ 综合 ⁄ 共 1233字 ⁄ 字号 评论关闭

关于优先队列的性质以及用途,见我另一篇文章~~

现在逐个讲清priority_queue的函数,,

首先,这个STL位于 <queue>中,

priority_queue<Type, Container, Functional>

type是储存的数据的类型,

Container 用于储存数据的容器(必须是数组型的,比如vector和deque 但不能用list)=。=

Functional 用于比较其优先级的。。(就是看谁应该是谁的父亲的比较函数)

但我们一般写成

priority_queue<int> Q;//最基本形式

创建一个int型的优先队列,名Q

默认为大顶堆(最大的在顶部),默认为vector容器

在讲一讲其函数

Q.empty();

判断堆中还有没有元素,如果有 返回0  没有返回1;

Q.push();

如果你是int型的,Q.push(某整数);

如果是某结构体node,Q.push(某node);

比如说 

int a = 10;
Q.push(a);
Q.top();

返回堆顶元素,比如说如果你是struct node{…………};
那么就 

node a = Q.top();
Q.pop();

删除堆顶元素,

一般情况下

priority_queue<int,vector<int>,greater<int> > Q;
priority_queue<int,vector<int>,less<int> > Q;

注意greater<int>后的空格。。。
greater是小的为顶,less是大的为顶
现在讲一讲如果用的是特殊的元素,,,
因为特殊,,所以优先队列自己没有写函数帮你判断~~~
所以你只能自己写一个operator重载啦~~

typedef struct node
{
	int a;
	int b;
}node;
bool operator<( node x, node y ){//注意operator后的小于号,表示如果返回为真那么就小于
    if( x.a == y.a )
	{
		return x.b > y.b;
    }
	else
	{
		return x.a > y.a; 
	}//这是一个重载比较函数的,当a相等时,b小的在前面,a不相等,a小的在前面(注意大于小于号!)
}
priority_queue<node> Q;

这样他就会按你写的比较方式比较

但有时你可能需要多个比较方式。。。

那么就。。。。。

typedef struct node
{
	int a;
	int b;
}node;
struct comp
{
	bool operator()(const node &x,const node &y)
	{
	    if( x.a == y.a )
		{
			return x.b > y.b;
	    }
		else
		{
			return x.a > y.a; 
		}
	}
};
priority_queue<node,vector<node>,comp> Q;

这个comp可以随便改~~而且你可以写很多个~~
还有将比较函数写在结构体内部的写法~~
不过这个本屌不懂。。。=。 =
有兴趣以后再去看吧~~
------------------------------------------------END

抱歉!评论已关闭.