priority_queue的实现,容器和仿函数

本文介绍了如何通过priority_queue实现堆排序,利用container复用STL,详细讲解了构造函数(包括无参和迭代器)、向上调整和向下调整的优化,以及仿函数在实现升序和降序操作中的复用价值。
摘要由CSDN通过智能技术生成

首先我们要实现priority_queue就必须要了解其底层,本质其实就是堆排序,大根堆就是升序排序,小根堆就是降序排序。

原因是因为,我们堆排序取元素可以将堆顶和最后一个元素交换,然后让堆顶下沉,这样可以维护堆的稳定性。

然后我们就来进行实现,通过Priority_queue我们既可以复习堆的实现又可以学习容器和仿函数。

我们先写好我们的模板和成员,这个container就是我们的容器,它可以复用我们的其他stl,这样就可以屏蔽底层细节,只要container能够实现我们等下所需要的功能,就可以实现完美复用。

然后就开始实现我们的构造函数,分别是无参构造和传迭代器的构造方法。

其中我们之所以选择向下调整,而不是选择push,是因为push建堆采用的是向上建堆,其时间复杂度是nlogn,而拷贝后从到数第二层的最后一个节点开始向下调整是logn的复杂度,此处省略计算过程。

然后我们实现向上调整和向下调整。

这样我们就可以发现我们容器的作用,我们不用再具体实现。

然后通过我们push,pop,tiop,empty的实现我们就可以发现通过container的接口我们很容易就实现了我们的功能,这就是容器的作用。

同理我们的less<>,也就是我们的仿函数,本质其实就是一个类,但是重载了()

如下

这样看起来就像一个函数了,但是本质是一个类。所以我们称之为仿函数。同样可以增加代码的复用。比如此处升序和降序仅仅只有>和<的区别,完全没必要再写一份函数,只要用仿函数就可以进行复用了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值