1、C++ STL中的 heap(堆)数据结构是一棵完全二叉树。在标准库中heap算法是在 algorithm 头文件中,提供了如下的几个操作的函数。
以下函数默认的第三个参数都是最大堆时的参数。若要使用最小堆,则需要显式的将第三个参数设为greater
- make_heap():根据指定的迭代器区间,来创建一个堆。
vector<int> v = { 10,20,5,60 };
// 创建最大堆,默认是创建最大堆。该堆的最大元素为二叉树根节点的元素 v[0]或v.front()
make_heap(v.begin(), v.end(), less<int>());
// 创建最小堆,该堆中根节点的元素最小
make_heap(v.begin(), v.end(), greater<int>());
- push_heap():把指定迭代区间的最后一个元素插入到heap中,常常和vector配合使用。
v.push_back(100);
push_heap(v.begin(), v.end(),less<int>()); //将容器末尾的值插入到堆的合适位置.
- pop_heap:将指定迭代区中的最后一个元素置于容器的末尾
// 将最大堆中的根节点元素置于容器的尾部,并未删除
pop_heap(v.begin(), v.end(), less<int>());
v.pop_back();//删除容器末尾的元素。
- sort_heap:进行堆排序
2、示例代码如下
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int arr[] = { 10,20,3,40,18 };
int len = sizeof(arr) / sizeof(arr[0]);
vector<int> vec(arr, arr + len); //用数组来初始化容器
make_heap(vec.begin(), vec.end()); //以容器vec中的元素来建立堆,默认是最大堆
cout << "The max heap: " << vec.front() << '\n';// 首元素为容器中的最大值
pop_heap(vec.begin(), vec.end());//将迭代器区间中的最大元素置于vector容器的末尾
vec.pop_back();//将此最大值删除
cout << "max heap after pop: " << vec.front() << '\n';
vec.push_back(99);//向容器末尾插入值
push_heap(vec.begin(), vec.end());//将指定区间的最后一个元素插入到heap中
cout << "max heap after push: " << vec.front() << '\n';
sort_heap(vec.begin(), vec.end());//对堆进行排序
cout << "final sorted range: ";
for (auto &i:vec)
{
cout << i << " ";
}
cout << endl;
system("pause");
}
输出结果如下:
参考资料:
STL——heap结构及算法
make_heap
C++ 标准库中的堆(heap)
STL中heap相关函数