首先我们要实现priority_queue就必须要了解其底层,本质其实就是堆排序,大根堆就是升序排序,小根堆就是降序排序。
原因是因为,我们堆排序取元素可以将堆顶和最后一个元素交换,然后让堆顶下沉,这样可以维护堆的稳定性。
然后我们就来进行实现,通过Priority_queue我们既可以复习堆的实现又可以学习容器和仿函数。
我们先写好我们的模板和成员,这个container就是我们的容器,它可以复用我们的其他stl,这样就可以屏蔽底层细节,只要container能够实现我们等下所需要的功能,就可以实现完美复用。
然后就开始实现我们的构造函数,分别是无参构造和传迭代器的构造方法。
其中我们之所以选择向下调整,而不是选择push,是因为push建堆采用的是向上建堆,其时间复杂度是nlogn,而拷贝后从到数第二层的最后一个节点开始向下调整是logn的复杂度,此处省略计算过程。
然后我们实现向上调整和向下调整。
这样我们就可以发现我们容器的作用,我们不用再具体实现。
然后通过我们push,pop,tiop,empty的实现我们就可以发现通过container的接口我们很容易就实现了我们的功能,这就是容器的作用。
同理我们的less<>,也就是我们的仿函数,本质其实就是一个类,但是重载了()
如下
这样看起来就像一个函数了,但是本质是一个类。所以我们称之为仿函数。同样可以增加代码的复用。比如此处升序和降序仅仅只有>和<的区别,完全没必要再写一份函数,只要用仿函数就可以进行复用了。