STL 堆的基本用法
今天做到一道题,用到了堆(heap)这种数据结构。之前学数据结构的时候自己也实现过,但是刷题的时候还是无脑用STL吧😂。
然后我就突然发现自己从来没用过STL里面的堆,于是在这里记一下基本用法,免得后面又去网上搜。
我们先定义一个数组
vector<int> nums = {3,2,3,1,2,4,5,5,6};
然后使用 make_heap() 函数把这个数组建成堆。注意,STL里面的堆相关的功能都是在 #include < algorithm > 中定义的,所以用之前别忘了导入这个。
make_heap()的用法如下:
make_heap(nums.begin(), nums.end());
其实跟STL里面的大部分接口保持一致,第3个参数也还可以传一个比较器,用于指明比较方法。例如:
make_heap(nums.begin(), nums.end(),greater<int>());
将建立最小堆
make_heap(nums.begin(), nums.end(),less<int>());
将建立最大堆
注意,上面两个不要记反了,最小堆传入的是greater,最大堆传入的是less
当然,你也可以取定义自己的比较器:
bool cmp(int& a, int& b){
return a > b;
}
make_heap(nums.begin(), nums.end(), cmp);
我们以最大堆为例,来讲讲如何降序输出数组nums中的元素
void heapSort(vector<int>& nums){
//升序->最大堆,降序->最小堆
//auto cmp = less<int>();
auto cmp = greater<int>();
make_heap(nums.begin(), nums.end(), cmp);
for(auto end = nums.end(); end != nums.begin(); end--){
pop_heap(nums.begin(), end, cmp);
}
}
首先将整个数组建成堆结构,然后每次输出堆顶元素,再使用
pop_heap(nums.begin(), end, less<int>());
这个函数的作用就是把堆顶元素移动到数组尾部,然后重新将数组nums.begin()和end之间的元素调整为最大堆。
注意,在调整的过程中记得更新end迭代器
需要注意的是pop_heap()函数并不是把堆顶元素从数组中移除,而是把它移动到数组尾部,这个和vector, stack, queue等结构的pop操作的语义是不同的。
如果我们需要插入一个元素,那么使用 push_heap() 函数即可,参数和上面两个一样。