STL 中与heap 有关的操作有
如下几个 :
make_heap(), pop_heap(), push_heap(),
sort_heap(), is_heap();
is_heap() :
原型如下 :
1. bool is_heap(iterator start, iterator end);
->判断迭代器[start, end] 区间类的元素是否构成一个堆. 是返回true ,否则返回 false.
2. bool is_heap(iterator
start, iterator end, StrictWeakOrdering cmp);
->判断迭代器[start,
end] 区间类的元素在cmp条件下是否构成一个堆. 是返回true ,否则返回 false.
make_heap() :
原型如下 :
1. void make_heap( random_access_iterator start,
random_access_iterator end );
2.
void make_heap( random_access_iterator start,
random_access_iterator end, StrictWeakOrdering cmp );
->以
迭代器[start , end] 区间内的元素生成一个堆. 默认使用
元素类型
的 < 操作符
进行判断堆的类型,
因此生成的是大顶堆 .
->当使用了
版本2时, 系统使用
用户定义的 cmp 函数来构建一个堆
->值得注意的是, make_heap 改变了
迭代器所指向的
容器
的值.
pop_heap() :
原型如下 :
1.
void pop_heap( random_access_iterator
start, random_access_iterator end );
2.
void pop_heap( random_access_iterator
start, random_access_iterator end, StrictWeakOrdering cmp );
->pop_heap() 并不是真的把最大(最小)的元素从堆中弹出来. 而是重新排序堆. 它把首元素和末元素交换,然后将[first,last-1)的数据再做成一个堆。
此时, 原来的 首元素 位于迭代器 end-1 的位置, 它已不再属于堆的一员!
->如果使用了
版本2
, 在交换了 首元素和末元素后 ,使用 cmp 规则 重新构建一个堆.
push_heap() :
原型如下 :
1.
void push_heap(
random_access_iterator start, random_access_iterator end );
2.
void push_heap( random_access_iterator start,
random_access_iterator end, StrictWeakOrdering cmp );
->
算法假设迭代器区间[start, end-1)内的元素已经是一个有效堆, 然后把 end-1 迭代器所指元素加入堆.
->
如果使用了
cmp 参数,
将使用
cmp 规则构建堆.
sort_heap() :
原型如下 :
1. void sort_heap (random_access_iterator start,
random_access_iterator end);
2. void
sort_heap (random_access_iterator start, random_access_iterator end,
StrictWeakOrdering cmp);
->
堆结构被完全破坏,
相当于对元素进行排序,
效果和排序算法类似.
-> 如果使用了 cmp 参数, 将使用 cmp 规则排序堆.
示例代码:
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional> // for greater<>, less<>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// v.begin and v.end can by replaced by &number[0], &number[9]
int number[10] = {2,1,10,8,90,30,9,98,6,7};
vector<int> v(number,number+10);
//make_heap (v.begin(),v.end()); // the first one is the largest one, others not sure.
//cout << "Initial Max heap: " <<v.front()<< endl;
//make_heap (v.begin(),v.end(),less<int>()); // the first one is the largest one, others not sure.
//cout << "Initial Max heap : " <<v.front()<< endl;
make_heap (v.begin(),v.end(),greater<int>()); // the first one is the smallest one, others not sure.
cout << "Initial Min heap: " <<v.front()<< endl;
//不是真的把最大(最小)的元素从堆中弹出来。而是重新排序堆。它
// 把first和last交换,然后将[first,last-1)的数据再做成一个堆。
//pop_heap (v.begin(),v.end());
//pop_heap (v.begin(),v.end(),less<int>());
pop_heap (v.begin(),v.end(),greater<int>());
v.pop_back(); // Pop up the last one
//cout << "Max heap after pop : " << v.front() << endl;
cout << "Min heap after pop : " << v.front() << endl;
v.push_back(80); // Put to the last one
//push_heap (v.begin(),v.end()); // Keep the first one is the largest one
//push_heap (v.begin(),v.end(), less<int>()); // Keep the first one is the largest one
push_heap (v.begin(),v.end(),greater<int>()); // Keep the first one is the smallest one
//cout << "max heap after push: " << v.front() << endl;
cout << "Min heap after push: " << v.front() << endl;
//sort_heap (v.begin(),v.end()); // sort by descent
//sort_heap (v.begin(),v.end(), less<int>()); // sort by descent
sort_heap (v.begin(),v.end(),greater<int>()); // sort by ascent
cout << "final sorted range :";
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout << endl;
return 0;
}