priority_queue的实现,容器和仿函数

2023-12-15 20:05:02

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

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

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

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

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

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

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

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

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

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

如下

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

文章来源:https://blog.csdn.net/qq_35639854/article/details/135017522
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。