浅谈优先级队列

优先级队列的概述

优先级队列就如何它的名字一样,同样是一个队列,同样遵循先入先出的规则,但不同的是它被叫做优先级队列,如同它的名字一样,在它内部是按照优先级来排序的,优先级也决定了哪个数据会被先出队列。我们可以去看看它的原型是什么样

浅谈优先级队列_第1张图片

 通过看它的原型就能得出,第一个为类型,第二个是容器在缺省状态下默认为vector,第三个是一个比较,第四个是一个小于。那么第一个和第二个我们能理解,但是第三,四个比较小于是什么意思,我们可以去试一试。

浅谈优先级队列_第2张图片

 当我们写下这样一段代码之后发现,less并不是向我们想象的一样是小的数先出队列,而是较大的数先出队列,那么说明less按小于比较,并且会将小于的数放在队列后面,对此我们可以试一试如果用大于来比较会不会是相反的结果

浅谈优先级队列_第3张图片

 很明显,当我们把比较函数换成大于之后,队列中的优先级就会变成由小到大这样一个结果。

优先级的队列底层结构

现在我们已经了解了优先级队列的原型是怎么样了,那么接下来我们再来看看它的底层实现又是如何呢。

我们知道,queue或者stack是一个适配器,它完成的工作主要是由底部的容器来实现的,那么优先级队列它的底部也有一个容器。那么同样在普通情况下它的大多数工作都是由底部容器来完成的。

例如:当我们想向队列中插入一个数据的时候,那么priority_queue就会去调用它底部容器的插入接口,例如底部是vector容器的情况下就会去调用vector的push_back的接口。

它的其他工作底部容器完全都可以实现,但是在队列中的数据会有一个由大到小(默认情况下)的顺序来进行排列的,这个是如何去实现它的呢。

其实它的底部是利用了一个建堆的算法,当一个数进入队列之后,会对这个数进行比较,如果这个数较大就会把它往顶上推。

你可能感兴趣的:(C++,算法,数据结构,c++)