priority _queue优先级队列

使用优先级队列 要包含 #include “queue”头文件

1什么是优先级队列?

优先级队列底层实际上是一个堆保准库默认为大根堆默认使用vector作为其底层的存储数据的容器,在vector上又使用了堆算法,make_heap push_heap pop_heap 将vector的数据构建成一个堆,因此priority就是一个堆,所有能用到堆的位置,都可以考虑使用priority_queue

标准库这样定义
template<class T,
class Cont = vector,
class Pred = lessCont::value_type >
class priority_queue
//
第三个参数 我们发现 ,默认情况下 用less(<)比较方式得到的是大堆;
第二个参数 Cont是 container 的缩写 意味着标准库默认底层存储容器尾vector;
第一个参数 :class T是推演出我们的元素类型
在更改比较方式(即想要小堆)时,我们将第三个默认参数less改为 greater ,并记得包含头文件
#include “functional”

堆: 将数据集合到一个数组中(实际上就已经得到了一颗完全二叉树)
1 知道根节点 怎么求孩子结点

i=0时为根节点 ;
直到双亲结点怎么求 左右孩子?
(其实就是层序遍历法)

左孩子 2* i+1
右孩子 2 * i + 2

2知道孩子怎么求双亲?

孩子 i;
双亲结点 =(i-1)/2;

大堆


Ki <=K2i+1 && Ki <=K2i+2
任意左右孩子都大于等于双亲,这样的堆称为 大堆

小堆:

Ki>=K2i+1 && Ki >=K2i+2
任意左右孩子都小于等于双亲,这样的堆称为 小堆

接口:
priority_queue()//构造
priority(first,last)//区间构造

empty()//判空
clear()//清空
push(x)//只能在尾部插入
pop()删除堆顶元素或者队首元素
top()//获取队首元素

优先级队列传值比较

我们使用 优先级队列进行比较时需要注意,我们比较的是什么 ?
我们给优先级队列里放置指针 ,编译可以通过,但是 ,这时,编译器只是对这两个指针的地址进行了比较 。

如果 是自定义的类对象的比较 ,我们想要的是对 对象内的成员变量进行比较 ,所以需要第对 > ( 或者 <)进行重载
例如 Date 类的两个类对象就需要重载

总结一下 :

优先级队列 默认底层容器是vector;
stack 栈和 queue队列,默认底层容器是deque(双端队列)

为什么要采用 deque 来作为 stack和 queue的底层容器呢?

1因为 deque的在底层不一定连续,所以deque的内存碎片利用率高;其次效率高
2 stack 和queue只能在固定的一段或两端操作。而deque 可以头插头删 尾插 尾删。

发布了90 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44030580/article/details/103031672