简介
C++中堆(heap)是在vector的基础上实现的。具体地,是定义了一些方法在vector类型数据上进行操作,包括
- make_heap 建立堆(默认最大堆)
- push_heap 加入元素
- pop_heap 删除元素
- sort_heap 堆排序义的一些方法
代码示例
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/* 自定义数据类型:包含一个整数、一个浮点数 */
typedef struct DoubleIndex
{
int id; // index
double val; // value
DoubleIndex(){}
DoubleIndex(int _id, double _val): id(_id), val(_val){}
/* 切记定义运算符重载 */
bool operator < (const DoubleIndex &b) const { return val < b.val; }
bool operator > (const DoubleIndex &b) const { return val > b.val; }
} DoubleIndex;
/* 比较函数 */
bool CompareDoubleIndex(const DoubleIndex &a, const DoubleIndex &b){
return a.val < b.val;
}
int main()
{
vector<DoubleIndex> list;
vector<DoubleIndex>::iterator iter;
/// 初始vector列表
list.push_back(DoubleIndex(1, 3.1));
list.push_back(DoubleIndex(2, 1.1));
list.push_back(DoubleIndex(3, 4.1));
list.push_back(DoubleIndex(4, 2.1));
list.push_back(DoubleIndex(5, 0.1));
/// 建立堆,make_heap这一步将上面的列表构造成一个堆
make_heap(list.begin(), list.end(), CompareDoubleIndex);
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/* 初始堆
3:4.1
4:2.1
1:3.1
2:1.1
5:0.1
*/
/// 加入元素第一步:新元素压入vector列表
list.push_back(DoubleIndex(6,10.1));
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/* 这是加入vector的效果,可以看到,新元素被放在了列表末尾
3:4.1
4:2.1
1:3.1
2:1.1
5:0.1
6:3.65
*/
// 加入元素第二步:新元素加入堆
push_heap(list.begin(), list.end());
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/* 可以看到,新元素[6:3.65]更新了原先第二层右边的节点[1:3.1]
3:4.1
4:2.1
6:3.65
2:1.1
5:0.1
1:3.1
*/
/// 堆排序
sort_heap(list.begin(), list.end());
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/*
5:0.1
2:1.1
4:2.1
1:3.1
6:3.65
3:4.1
*/
return 0;
}