一、概念
std::priority_queue
是 C++ 标准模板库(STL)中的一种适配器容器,用于实现优先队列数据结构。与普通的std::queue
不同,std::priority_queue
中的元素会根据优先级排序,优先级最高的元素总是位于队列的前端(即可以通过top()
函数访问到)。这是通过使用堆(通常是大堆)来实现的。
通过上面的陈述可以了解到:进入priority_queue的数据会按一定规则——优先级排序。
那这是按照什么规则排序的呢?
- priority_queue 内部使用的是一种特殊的二叉树结构完全二叉树的结构,排序:大堆或者小堆(默认的大堆)
- 大堆:每个节点的值都大于或等于其子节点的值(根节点是最大值)
- 小堆:每个节点的值都小于或等于其子节点的值(根节点是最小值)
因为二叉树是一个比较复杂且巧妙的内容,如果仔细介绍需要花费很大的篇幅,这里只是简单的一笔带过,想要了解更多的关于二叉树大堆小堆,建堆规则,向上调整向下调整等知识建议先系统学习数据结构:树部分。
priority_queue中的 top() 会是数值最大值或者最小值(大堆堆顶是最大值,小堆堆顶是最小值)
二、使用
了解priority_queue的底层结构之后,priority_queue的使用非常的简单!!
2.2 priority_queue类模板定义
priority_queue类的模板相较于queue是更复杂一点的,也是我们学习的难点:(源定义)
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
>
class priority_queue{
... ...
}
上面的源码中类模板给了缺省值:默认容器是vector,默认生成的是