早上本来想写写英语作文的,结果看作文题目过于简短,于是就来学学优先队列的用法哈哈哈。
优先队列介绍
队列是一种先进先出的数据结构,比较符合我们的思维模式,至今我也学了一些算法使用了队列,比如最短路径的SPFA算法,现在又学到了拓扑排序。但是这次并不是队列这么简单,而是用到的高级版的队列,即优先队列。
优先队列(priority queue),顾名思义,就是队列中的各元素被赋予了相应的优先级,就好像最原始的队列,其实也是有优先级的,即是先入队的优先。而优先队列,其元素的优先级就不仅仅局限于入队的先后顺序,而是可以被自定义为元素的大小,这类似与堆的操作。
C++的标准模板库(STL)中的优先队列
在STL中定义的优先队列,其元素的默认比较规则是按元素从大到小排列,我们可以通过重载”<”来重新定义比较规则。(据说重载”>”会出问题,具体以后在尝试,flag先立着)。
接下来我们来看看优先队列在STL中是如何被定义的:priority_queue<Type,Container,Functional>
,其中Type是数据类型(可以是任何数据类型,包括自己定义的一些乱七八糟的),Container是存储数据所使用的容器(可以使用vector、deque,但是不能使用list,默认是vector),Functional是比较的方式。
STL优先队列的使用
定义
priority_queue<Type,Container=vector<Type>,cmp=greater<Type>>que;
其中,第一个参数为数据类型,第二个参数为容器(默认为vector),第三个参数为比较函数(默认大值优先)。
比较函数的写法
- 使用C++自带的库函数
- 自定义优先级1
- 自定义优先级2
- 自定义优先级3
方法一:使用C++自带的库函数
首先在头文件中引用include库函数
#include<functional>
functional 中提供了如下的基于模板的比较函数对象。
- equal_to
: 等于 - not_equal_to
: 不等于 - greater
: 大于 - greater_equal
: 大于等于 - less
: 小于 - less_equal
: 小于等于
创建方法:priority_queue<int,vector<int>,less<int>>que;
方法二:自定义优先级1,队列元素为数值型
1 | struct cmp1{ |
创建方法:priority_queue<int,vector<int>,cmp1>que;
方法三:自定义优先级2,队列元素为结构体
1 | struct node1{ |
创建方法:priority_queue<node1>que;
方法四:自定义优先级3,队列元素为结构体
1 | struct node{ |
创建方法:priority_queue<node>que;
return 0;
本文链接:
https://luojinrong.github.io/2018/11/16/C-优先队列stl/