STL容器(五)——heap

STL容器(五)——heap

我们可以调用STL中的heap堆,实现建堆和堆排序等操作。

首先,STL中的heap默认构建的是最大堆,程序如下:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std; 

int main()
{
	int a[]={2, 3, 5, 1, 9, 6};
	vector<int> vec(a, a+6);
	vector<int>::iterator iter; 

	//建堆,默认是最大堆
	make_heap(vec.begin(), vec.end());
	cout<<"建堆之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	//增加元素
	vec.push_back(8);   // 先在vector容器中增加元素
	push_heap(vec.begin(), vec.end());   // 再做堆调整
	cout<<"增加元素之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	//删除元素,默认是堆顶元素
	pop_heap(vec.begin(), vec.end());   // 先做堆调整
	vec.pop_back();   // 再从vector容器中删除元素
	cout<<"删除元素之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	//堆排序,最大堆排序之后是正序
	sort_heap(vec.begin(), vec.end());
	cout<<"堆排序之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	return 0; 

}

结果:

我们发现,heap的操作还是要依靠vector容器的,它只是在vector的基础上,实现make_heap, push_heap, pop_heap, sort_heap的操作。

如果我们想建立一个最小堆呢?这就需要我们看看STL中对heap操作的定义了,如下:

make_heap()函数原型是:void make_heap(first_pointer,end_pointer,compare_function); 一个参数是数组或向量的头指针,第二个向量是尾指针。第三个参数是比较函数的名字。在缺省的时候,默认是大跟堆。(下面的参数都一样就不解释了)作用:把这一段的数组或向量做成一个堆的结构。范围是(first,last)

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

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

sort_heap()的函数原型是void sort_heap(first_pointer,end_pointer,compare_function);作用是sort_heap对[first,last)中的序列进行排序。

那么每个函数最后的compare-function到底是什么呢?其实这个就是决定了我们建立的是最大堆还是最小堆。这个比较函数和qsort一样,是可以自定义的,如下:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std; 

bool cmp(int a, int b)
{
	return a > b;   //如果a较大,返回真, a排在后面,最小值在前面,即最小堆
}

int main()
{
	int a[]={2, 3, 5, 1, 9, 6};
	vector<int> vec(a, a+6);
	vector<int>::iterator iter; 

	//建堆,此时是最小堆
	make_heap(vec.begin(), vec.end(), cmp);
	cout<<"建堆之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	//增加元素
	vec.push_back(0);   // 先在vector容器中增加元素
	push_heap(vec.begin(), vec.end(), cmp);   // 再做堆调整
	cout<<"增加元素之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	//删除元素,默认是堆顶元素,这里我们删除两个元素
	pop_heap(vec.begin(), vec.end(), cmp);   // 先做堆调整
	vec.pop_back();   // 再从vector容器中删除元素
	pop_heap(vec.begin(), vec.end(), cmp);   // 先做堆调整
	vec.pop_back();   // 再从vector容器中删除元素
	cout<<"删除元素之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	//堆排序,由于构建的是最小堆,所以这里排序是逆序的
	sort_heap(vec.begin(), vec.end(), cmp);
	cout<<"堆排序之后:"<<endl;
	for(iter = vec.begin(); iter != vec.end(); iter++)
		cout<<*iter<<' ';
	cout<<endl; 

	return 0; 

}

结果:

注意:如果构建的是最大堆,那么排序之后就是正序的;如果构建的是最小堆,那么排序之后就是逆序的。

这样我们就会通过STL中的heap来使用堆排序了。

参考链接:

http://blog.csdn.net/puqutogether/article/details/43195703

http://blog.csdn.net/hnust_xiehonghao/article/details/9172875

http://blog.csdn.net/morewindows/article/details/6967409

http://blog.csdn.net/lwfcgz/article/details/8760092

时间: 2024-10-03 21:41:19

STL容器(五)——heap的相关文章

C++STL容器简析

标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multiset.map和multimap.非标准的关联容器hash_set.hase_multiset.hash_map和hash_multimap. (1)vector容器vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,

STL - STL容器的适用情况

原文地址:http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ 一.各种容器的特性 vector 典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取.修改具有常数时间复杂度,在序列尾部进行插入.删除是常数时间复杂度,但在序列的头部插入.删除的时间复杂度是O(n),可以 在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑. deque 序列容器,

STL容器的适用情况

转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; mso-bidi-font-family:"times new roman"; mso-bidi-theme-font:minor-bidi;} @page {mso-page-border-surround-header:no; mso-page-border-surround-footer

C++ STL容器底层机制

1.vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array. vector动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配

6.5-数据结构&amp;算法-标准模板STL/STL容器/向量

一.标准模板库(STL) 1.定义了一系列的容器模板,实现泛型化的数据结构. 1)向量(vector),内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高. 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高. 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效率都比较高. 以上三种合称为线性容器. 4)堆栈(stack),后进先出 5)队列(queue),先进先出 6)优先队列(priorit

STL容器简介

C++标准定义了一系列的容器的共通要求,适用于所有的STL容器,然而由于C++11带来了容器的多样化,因此可能出现若干例外. ?初始化: 每个容器都提供了一个default构造函数,一个copy函数和一个析构函数 ? ? ?

STL容器之一vector

STL中最简单也是最有用的容器之一是vector<T>类模板,称为向量容器,是序列类型容器中的一种. 容器容量可以选择性修改.(1)声明:vector<type>  v;    //容量为0构造v对象,指定元素类型为typevector<type>  v(n);    //容量为n构造v对象,指定元素类型为typevector<type>  v(n, initValue);    //容量为n构造v对象,指定元素类型为type,且所有元素被初始化为initV

STL容器的遍历删除

STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的表项(当然这个函数是应该运行在另起一个线程上的),但是在按照下面的方法对hash_map(用迭代器)遍历删除时,当找到第一个满足删除条件的元素并将其删除后,程序将提示非法: for(list<int>::iterator iter = m_map.begin(); iter != m_map.en

STL 容器

标准库为相关对象的存储集合提供了各种类型安全容器.容器是类模板:在声明容器变量时,你可以指定该容器将保存的元素类型.可以使用初始值设定项列表构造容器.它们具有用于添加和移除元素以及执行其他操作的成员函数.可使用迭代器循环访问容器中的元素以及访问单个元素.可以通过使用其成员函数和运算符以及全局函数来显式使用迭代器.还可以隐式使用它们,例如通过使用范围 for 循环.所有 STL 容器的迭代器都有一个通用接口,但是每个容器会定义自己的专用迭代器. 容器可以分为三个类别:序列容器.关联容器和容器适配器