关于优先队列的性质以及用途,见我另一篇文章~~
现在逐个讲清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