STL中heap相关函数用法

make_heap 函数

这个函数用来将一段现有的数据转化为一个heap

template<class RandomAccessIterator>  
1: make_heap(RandomAccessIterator first, RandomAccessIterator last)
2: make_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)  

将[first, last)范围进行堆排序,默认使用使用最大堆排序,其中改为最小堆时,使用greater,注意greater在#include <functional>头文件中。

sort_heap 函数

template<class RandomAccessIterator> 
1: sort_heap(RandomAccessIterator first, RandomAccessIterator last) 
2: sort_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)   

将一个堆排序,运用这个函数时,首先必须是一个堆,如果不是一个堆的数据用这个函数,会出现错误,因此在用这个函数之前可以先做一次make_heap。

特别注意: 
如果一个数据是最大堆排序的,sort_heap 也要用最大堆排序; 
如果一个数据是最小堆排序的,sort_heap 也要用最小堆排序,否则会报错
即:make_heap(first, last, less<int>()) 要于 sort_heap(first, last, less<int>()) 对应 
make_heap(first, last, greater<int>()) 要于 sort_heap(first, last, greater<int>()) 对应

push_heap 函数

对刚插入的(尾部)元素做堆排序。

template<class RandomAccessIterator>  
1: push_heap(RandomAccessIterator first, RandomAccessIterator last)  
2: push_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)   

pop_heap 函数

将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。

template<class RandomAccessIterator>  
1: pop_heap(RandomAccessIterator first, RandomAccessIterator last)   
2: pop_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)  

示例  

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
	int ia[9] = { 0,1,2,3,4,8,9,3,5 };
	vector<int> ivec(ia, ia + 9);
	make_heap(ivec.begin(), ivec.end(), greater<int>());
	for (int i = 0; i < ivec.size(); ++i)
		cout << ivec[i] << " ";  //输出结果为:0 1 2 3 4 8 9 3 5
	cout << endl;

	make_heap(ivec.begin(), ivec.end());
	for (int i = 0; i < ivec.size(); ++i)
		cout << ivec[i] << " ";//输出结果为:9 5 8 3 4 0 2 3 1
	cout << endl;

	ivec.push_back(7);
	push_heap(ivec.begin(), ivec.end());
	for (int i = 0; i < ivec.size(); ++i)
		cout << ivec[i] << " ";//输出结果为:9 7 8 3 5 0 2 3 1 4
	cout << endl;  

	pop_heap(ivec.begin(), ivec.end());//只是将第一元素和最后一个元素换了一个位置,并没有删除
	for (int i = 0; i < ivec.size(); ++i)
		cout << ivec[i] << " ";//输出结果为:8 7 4 3 5 0 2 3 1 9
	cout << endl;  
	ivec.pop_back();
	
	sort_heap(ivec.begin(), ivec.end());
	for (int i = 0; i < ivec.size(); ++i)
		cout << ivec[i] << " ";//输出结果为:0 1 2 3 4 5 7 8
	cout << endl;
}

猜你喜欢

转载自blog.csdn.net/chen134225/article/details/79921552