priority_queue适配器,又被称为“优先队列”,priority意为“优先权”,这里的priority指的是适配器会将所有元素中权值最高的元素置于顶部(默认是权值最高,但是我们可以通过仿函数来更改规则),以展现优先级。同时优先队列没有FIFO(先入先出)这个规则,插入元素是通过push()或emplace(),删除元素是通过pop(),不能进行随机元素访问,能且仅能操作堆顶元素top(),同队列相比有很大的差别!值得注意的是,优先队列是不会将元素进行按权排序的,所以读者切勿理解为会排序的队列!
优先队列的底层是通过堆来适配的,具体来说是二叉堆,适配容器既可以是vector容器又可以是deque容器,如果是简单使用优先队列,其默认适配容器为vector容器,无需显式书写。优先队列普遍应用于Dijkstra最短路径算法、哈夫曼编码等按权决定的算法,对于算法竞赛选手来说极为重要!
想要使用优先队列,必须包含头文件<queue>,同时优先队列接口有别于队列接口,切勿混淆二者接口,胡乱使用,下面就让我们通过代码来了解优先队列。
#include<iostream> #include<queue>//使用priority_queue适配器必须包含头文件<queue> using namespace std; /*priority_queue适配器*/ void test() { /*优先队列与队列截然不同!*/ priority_queue<int> pq; pq.push(1); pq.emplace(114514); pq.push(0); pq.push(78); /*队首为权值最大的值*/ cout << "根据优先队列的特性,遍历元素后将会是降序排序:"; while(!pq.empty()) { cout << pq.top()<< " "; pq.pop(); } cout << '\n'; } int main() { test(); return 0; }
代码编译如下:
优先队列理解起来相对简单,比如我们只能操作堆顶元素,查看容器是否为空通过empty(),查看元素总数用size(),交换两个同类型的容器用swap(),增用emplace()或push(),删用pop(),这就是优先队列的所有接口!读者学会了吗,快去试着创建一个优先队列练习一下吧!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程