c++中的堆-priority_queue的使用方法
堆作为一个重要的数据结构,应该是接触编程的人员都会了解的,本文是在写leetcode中,由于需要经常使用到堆这一数据结构而写的学习记录帖。即使手撸一个堆并不复杂,但是还是大大拖慢的写题节奏,更何况自己写的堆无论是效率还是安全性咱也没什么信息,这就是STL各个模板发挥的时候了。这里就来简单介绍一下priority_queue,即优先队列。
1 priority_queue的底层实现
PriorityQueue中的元素在逻辑上构成了一棵完全二叉树,但实际这个堆结构在物理存储上是用数组实现的。如果有兴趣了解,可以看看这个博客。
2 priority_queue基本操作
2.1 已有数据类型初始化
小根堆初始化
priority_queue<int,vector<int>,greater<int>> p
大根对初始化
priority_queue<int,vector<int>,less<int>> p
三个参数的意思:
/*
@para p1 :该队列盛放的数据类型
@para p2 :container,需要是数组实现,一般就是vector
@para p3 :比较器,(因为涉及到了比较排序嘛
*/
一般如果我们要使用大根堆且不用自定义的数据结构,只要填写第一个参数即可:
priority_queue<int> p
对于一些已由的数据类型,我们就免去了定义比较器的麻烦,直接使用greater<>
或less<>
即可。值得注意的是,对于tuple
和pair
这样的结构,也已经定义好了比较器:
- pair举例
//默认是使用大根堆
priority_queue<pair<int,int>> pq0;
//小根堆,按照pair的first排,再按照second排序
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq1;
//大根堆
priority_queue<pair<