优先队列的重载运算符
引言
首先我们先来介绍一下sort的自定义比较方式
最经典的题就是noip2007的奖学金
第一种就是用比较器函数
struct node{ int x,y; }a[105]; bool cmp1(node a, node b)//降序 { return a.x>b.x; } bool cmp2(node a, node b)//升序 { return a.x<b.x; }
我们在写sort时只需要
sort(a+1, a+n+1, cmp1)
关于return后的内容:我们可以简单理解为:
a为前一个对象,b为后一个对象。当a>b时返回true,意味着要求a>b。那么得到一个降序序列
第二种方法就先留一个悬念
大家都知道,STL的优先队列是个好东西
但它怎么如同sort一样
自定义比较方式呢
这里就献上几种
重载运算符的方法
First
如果对象是int
STL默认是大根堆
只需要
把 priority<int> Q
换成priority<int, vector<int>, greater<int> > Q
它就能摇身变为小根堆
Secondly
重点是结构体的重载运算符
隆重推出
operator
给出四种方法吧。它们是等价的,只是写法不同。功能都是重载运算符<
而这四种方法同时也就是前文sort的第二种方法(sort默认是升序,所以在结构体里添加一个如下的operator,就相当于以x为比较对象降序)
对于优先队列而言,如下的operator,就相当于以x为比较对象的小根堆
struct node{ int x; int y; friend bool operator<(const node a,const node b) { return a.x>b.x; } }; priority_queue<node> Q;
struct node{ int x; int y; bool operator<(const node &a) const { return x>a.x; } }; priority_queue<node> Q;
struct node{ int x; int y; }point; bool operator<(const node &a,const node &b) { return a.x>b.x; } priority_queue<node> Q;
struct node{ int x; int y; }; struct cmp{ bool operator()(node a,node b){ return a.x>b.x; } }; priority_queue<node,vector<node>,cmp> Q;
如果我们需要一个以x为比较对象的大根堆,只需要将return后的内容改为 a.x<b.x;