cpp优先队列(priority_queue)

优先队列的概念

  • 在优先队列中,队列中的每个元素都与某个优先级相关联,但是优先级在队列数据结构中不存在。

  • 优先队列中具有最高优先级的元素将被首先删除,而队列遵循FIFO(先进先出)策略,这意味着先插入的元素将被首先删除。

  • 如果存在多个具有相同优先级的元素,则将考虑该元素在队列中的顺序。

 

优先队列的语法
priority_queue<Type, Container, Functional>

其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。

1.在STL中,默认情况下(不加后面两个参数)是以vector为容器,以 operator< 为比较方式,所以在只使用第一个参数时,优先队列默认是一个最大堆,每次输出的堆顶元素是此时堆中的最大元素。

2.用到最小堆,则一般要把模板的三个参数都带进去。STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明最小堆(升序)

 

大顶堆与小顶堆

1. 大顶堆(降序)
//构造一个空的优先队列(此优先队列默认为大顶堆)
priority_queue<int> big_heap;

//另一种构建大顶堆的方法
priority_queue<int,vector<int>,less<int> > big_heap2;


2. 小顶堆(升序)
//构造一个空的优先队列,此优先队列是一个小顶堆
priority_queue<int,vector<int>,greater<int> > small_heap;

 

注意事项
需要注意的是,如果使用less和greater,需要头文件:#include <functional>

 

补充知识:

堆通常是一个可以被看做一棵完全二叉树(逻辑层面上)的数组对象(物理层面上),常用来在一组变化频繁(发生增删查改的频率较高)的数据中寻找最值.将根结点最大的堆叫做最大堆大根堆,这样可以找到堆中的最大值(根节点的值);根结点最小的堆叫做最小堆小根堆,这样可以找到堆中的最小值。

 

posted @ 2022-12-18 17:14  blogzzt  阅读(687)  评论(0编辑  收藏  举报