STL的heap的使用

经常看到找出一序列的数据中的最大或最小n位数。一般这都是用堆来实现。如果找出最大10位数,那么创建一个包含10个元素的最小堆,当插入一个元素,判断是否比堆顶元素大,如果大,那么就弹出堆顶元素,插入该元素,否则,忽略该元素。最大堆也是同样的思路。

但是每次都我们自己去创建一个堆,非常麻烦。stl中给我们提供了现成的函数。

make_heap();、pop_heap();、push_heap();、sort_heap();


void make_heap(first_pointer,end_pointer,compare_function);
一个参数是数组或向量的头指针,第二个向量是尾指针。第三个参数是比较函数的名字。在缺省的时候,默认是大跟堆。


void pop_heap(first_pointer,end_pointer,compare_function);
作用:pop_heap()不是真的把最大(最小)的元素从堆中弹出来。而是重新排序堆。它把first和last交换,然后将[first,last-1)的数据再做成一个堆。


void pushheap(first_pointer,end_pointer,compare_function);
作用:push_heap()假设由[first,last-1)是一个有效的堆,然后,再把堆中的新元素加进来,做成一个堆。


void sort_heap(first_pointer,end_pointer,compare_function);
作用是sort_heap对[first,last)中的序列进行排序。它假设这个序列是有效堆。(当然,经过排序之后就不是一个有效堆了)

例子:

#include
#include
using namespace std;

bool cmp(int a,int b)//最小堆
{
	return a>b;
}
void printData(int data[],int count)
{
	int i=0;
	for(i;i>input)
	{
		if(inpu<=data[0])
			continue;
		pop_heap(&data[0],&data[10],cmp);
		printData(data,10);
		data[9]=input;//pop出的元素放在末尾
		push_heap(&data[0],&data[10],cmp);//只是调整而已
		printData(data,10);
		sort_heap(&data[0],&data[10],cmp);
		printData(data,10);
	}
}

STL的heap的使用_第1张图片

你可能感兴趣的:(STL)