Priority Queue in C++

当我们想用堆的时候,我们可以用priority_queue<>的这个模板,

它的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个
参数缺省的话,优先队列就是大顶堆,队头元素最大。

所以当我们使用priority_queue的时候,可以忽略Container,Functional 直接使用,比如

priority_queue<int>  这个就是最大堆,队顶的永远是最大的。所以,当我们想自己定义大和小的话,对于系统自带的,无法重新定义opeator< 的类型(int,double)我们可以使用系统自带的模板函数, greater<TMP>,less<TMP> ,这个定义在库functional中。


对于我们自己的类,我们可以重载操作符<来达到排序的目的。代码如下:

class Node {
public:
    int val;
    Node(int x):val(x){};
    bool operator< (Node a) const{
        return val<a.val;
    }
};
注意,bool operator< (Node a) const,很重要,不加的话编译时会报错。顺便复习一下知识点,这个const代表该函数无法修改成员变量。

除此之外,如果不重载<的话,我们还可以自己写仿函数来实现,代码如下:

<pre name="code" class="cpp">class Node {
public:
    int val;
    Node(int x):val(x){};
};
struct cmp{
    bool operator()( Node a, Node b ){
        return a.val < b.val;
    }
};

int main() {
    priority_queue<Node,vector<Node>,cmp> que;
    que.push(Node(1));
    que.push(Node(2));
    return 0;
}


 

注!如果说,我想构造一个新的比较函数,但是这个比较函数要用到额外的信息来进行比较。所以我需要传入一些值到我的比较类cmp中,只可以用初始函数表这个方法  来做,感谢zzh。

<pre name="code" class="cpp">class mycompare{
public:
	mycompare(map<string, int> score) :m(score){};
	bool operator()(S a, S b)
	{
		return contentScoreMap[a.id]<contentScoreMap[b.id];
	}
private:
	map<string, int> m;
};


class schedule{
public:
	schedule(map<string, int> a) :m(a), contents((mycompare(m))){}
private:
<span style="white-space:pre">	</span>map<string, int> m;
<span style="white-space:pre">	</span>priority_queue<S, vector<S>, mycompare> contents;
};


 

 考虑上述代码,在mycompare中,因为需要使用到contentScoreMap来进行比较。所以需要把contentScoreMap传入到mycompare的类中,这里我们使用了初始化列表, contents(mycompare(contentScoreMap)) 来达到这个效果。 切记!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值