初识优先队列——priority_queue
这个是STL中的特殊容器,和学习其他容器vector,queue,stack一样,我们用类比的方式来学习它。
首先,当然是怎么定义了。。priority_queue<Type, Container, Functional>
既然是优先队列,总该有个优先的原则吧,怎么去优先呢?显然你要给个标准它。这里我们就需要提供一个比较函数,记住STL中是使用"<"来进行优先级比较的。首先我们利用默认的比较函数来定义队列:
priority_queue<int> q;
这样我们声明的a是用基本容器vector装的int型数据,队列头是数值大的元素。要是我们想构造一个小元素在前的队列怎么弄呢?
我们需要重载小于比较符。
struct cmp
{
bool operator()(int a,int b)
{ return a>b; }
}
priority_queue<int,vector<int>,cmp> q;
这样就做成了一个从小到大的队列。
接着,要是想构造结构体优先队列怎么办呢?嘿嘿,除了类似上面的方式,还有如下方式可以解决:
struct node
{
int x,y;
friend bool operator<(node a,node b)
{ return a.y>b.y; }
};
priority_queue<node> q;
事实上第一个方法比上面的这个要通用写。因为当要改变基本数据类型(比如int)的比较规则的时候,只能用第一个方法!