1.头文件#include <algorithm>
STL在algorithm.h 文件中实现了 对存储在数组或者vector中的元素进行相关堆化的 函数,包括 : make_heap, pop_heap, push_heap, sort_heap。
可以看出,heap实现有两层,底层是数组或者vector,上层是heap。
2.heap相关的四个函数
- make_heap( ):建立堆(要么大顶堆,要么小顶堆)
- push_heap( ): 在堆中添加元素
- pop_heap( ): 在堆中删除元素
- sort_heap( ): 堆排序
函数参数:例如:make_heap(_First, _Last, _Comp)
_First, _Last:可以随机访问的迭代器/ 指针
_Comp: 比较函数(仿函数),其规则——如果函数的第一个参数小于第二个参数应返回true,否则返回false。默认less
大根堆 :_Comp:参数为less()
小根堆:为greater()
不加则默认建立大根堆;
例子:
1.建堆,本例中使用vector来构建最小堆
2.调整堆
当使用上述的make_heap()建完堆后,如果vector使用push_back()插入数据或pop_back()删除数据后,会破坏最大堆/最小堆的性质,所以需要调整堆,常用push_heap()和pop_heap()两个方法。
1、push_heap()用法是,vector先push_back(),后push_heap():
2、pop_heap()用法是,先pop_heap(),vector后pop_back():
这里关注一下pop_heap的用法。通过堆的相关性质,我们知道在堆中删除一个元素,是为了把堆顶元素删除。如果我们先采用vector的pop_back(),则只是针对vector的最后一个元素。
而先pop_heap()的话,相当于是先把堆顶元素放到了vector的最后一个位置,然后对其前面的数字重新建立了一个堆,之后把在vector最后位置的原堆顶元素pop,就得到了新堆。如果还熟悉堆的数据结构和相关操作的话,这就是从堆中删除元素的步骤了。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print_heap(vector<int> &v){
for(vector<int>:: iterator it =v.begin();it!=v.end();++it){
cout<<*it<<' ';
}
cout<<'\n'<<endl;
}
int main(){
vector<int> min = {10,30,22,6,15,9};
make_heap(min.begin(),min.end(), greater<int>());
print_heap(min);
min.push_back(20);
push_heap(min.begin(),min.end(),greater<int>());
print_heap(min);
pop_heap(min.begin(),min.end(),greater<int>());
min.pop_back();
print_heap(min);
sort_heap(min.begin(),min.end(),greater<int>());
print_heap(min);
return 0;
}