STL的堆操作

STL里面的堆操作一般用到的只有4个:make_heap();、pop_heap();、push_heap();、sort_heap();

他们的头文件函数是#include
<algorithm>

首先是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)是一个有效的堆,如果不是有效堆就老老实实用make_heap()

然后,再把堆中的新元素加进来,做成一个堆。


最后是sort_heap()void
sort_heap(first_pointer,end_pointer,compare_function);

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

下面是一个数组heap的例子

 #include<algorithm>
#include<cstdio>
using namespace std; bool cmp(int a,int b)//小根堆,降序排序
{
return a>b;
} int main()
{
int i,number[]={,,,,,,,,,,,}; make_heap(&number[],&number[]);
//结果是:51 35 40 23 29 20 26 22 19 12 17 15
for(i=;i<;i++)
{
printf("%d ",number[i]);
}
printf("\n"); make_heap(&number[],&number[],cmp);
//结果:12 17 15 19 23 20 26 51 22 29 35 40
for(i=;i<;i++)
{
printf("%d ",number[i]);
}
printf("\n"); //加入元素8
number[]=;
//加入后调整
push_heap(&number[],&number[],cmp);
//结果:8 17 12 19 29 15 26 22 23 51 35 40 20
for(i=;i<;i++)
{
printf("%d ",number[i]);
}
printf("\n"); //弹出元素8
pop_heap(&number[],&number[],cmp);
//结果:12 17 15 19 23 20 26 51 22 29 35 40 8
for(i=;i<;i++)
{
printf("%d ",number[i]);
}
printf("\n"); sort_heap(&number[],&number[],cmp); //降序
//结果不用说都知道是有序的了!
for(i=;i<;i++)
{
printf("%d ",number[i]);
}
return ;
}

下面是一个vector heap的例子

 #include <iostream>
#include <algorithm>
#include <vector>
using namespace std; const int VECTOR_SIZE = ; int main()
{
vector<int, allocator<int> >Numbers(VECTOR_SIZE) ;
vector<int, allocator<int> >::iterator it ; // Initialize vector Numbers
Numbers[] = ;
Numbers[] = ;
Numbers[] = ;
Numbers[] = ;
Numbers[] = ;
Numbers[] = ;
Numbers[] = ;
Numbers[] = ; // print content of Numbers
cout << "Numbers { " ;
for(it = Numbers.begin(); it != Numbers.end(); it++)
{
cout << *it << " " ;
}
cout << " }\n" << endl ; // convert Numbers into a heap
make_heap(Numbers.begin(), Numbers.end()) ; //缺省参数生成大根堆 cout << "After calling make_heap\n" << endl ;
// print content of Numbers
cout << "Numbers { " ;
for(it = Numbers.begin(); it != Numbers.end(); it++)
{
cout << *it << " " ;
}
cout << " }\n" << endl ; // sort the heapified sequence Numbers
sort_heap(Numbers.begin(), Numbers.end()) ; //缺省参数默认升序排列 cout << "After calling sort_heap\n" << endl ;
// print content of Numbers
cout << "Numbers { " ;
for(it = Numbers.begin(); it != Numbers.end(); it++)
{
cout << *it << " " ;
}
cout << " }\n" << endl ; //insert an element in the heap
Numbers.push_back() ; //在堆的尾部添加一个数据
//push_heap(Numbers.begin(), Numbers.end()) ; //因为之前使用sort对堆进行了排序,所以
//[first,last-1)不是一个有效的堆,push_heap没效果
// you need to call make_heap to re-assert the
// heap property
make_heap(Numbers.begin(), Numbers.end()) ; //使用这个直接全部重新生成新堆 cout << "After calling push_heap and make_heap\n" << endl ; // print content of Numbers
cout << "Numbers { " ;
for(it = Numbers.begin(); it != Numbers.end(); it++)
{
cout << *it << " " ;
}
cout << " }\n" << endl ; // remove the root element from the heap Numbers
pop_heap(Numbers.begin(), Numbers.end()) ; cout << "After calling pop_heap\n" << endl ; // print content of Numbers
cout << "Numbers { " ;
for(it = Numbers.begin(); it != Numbers.end(); it++)
{
cout << *it << " " ;
}
cout << " }\n" << endl ;
return ;
}
/*
程序输出为: Numbers { 4 10 70 10 30 69 96 100 }
之后调用 make_heap Numbers { 100 30 96 10 4 69 70 10 }
之后调用 sort_heap Numbers { 4 10 10 30 69 70 96 100 }
之后调用 push_heap 和 make_heap Numbers { 100 69 96 30 4 70 10 10 7 }
之后调用 pop_heap Numbers { 96 69 70 30 4 7 10 10 100 }
*/

STL——heap的4大操作的更多相关文章

  1. STL -- heap结构及算法

    STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个 ...

  2. [STL]heap和priority_queue

    一.heap 在STL中,priority_queue(优先权队列)的底层机制是最大堆,因此有必要先来了解一下heap.heap采用完全二叉树的结构,当然不是真正的binary tree,因为对于完全 ...

  3. POJ 2442 Squence (STL heap)

    题意: 给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列, 让你求出序列和最小的前n个序列的序列和. 解题思路: 1.将第一序列读入seq1向量中,并按升序排序. ...

  4. STL——heap结构及算法

    heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority q ...

  5. 【算法学习】老算法,新姿势,STL——Heap

    “堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queu ...

  6. STL heap部分源代码分析

    本文假设你已对堆排序的算法有主要的了解. 要分析stl中heap的源代码的独到之处.最好的办法就是拿普通的代码进行比較.话不多说,先看一段普通的堆排序的代码: //调整大顶堆.使得结构合理 void ...

  7. STL~heap

    1.定义 堆:若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树 树中任一非叶子结点的关键字均不大于(或不小于)其子结点的关键字.分为大根数(默认 ...

  8. STL heap usage

    简介 heap有查找时间复杂度O(1),查找.插入.删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下: make_heap() push_heap() pop_heap() sor ...

  9. STL中常用容器及操作 学习笔记1

    @[TOC](下面介绍STL中常见的容器及操作)## 不定长数组 vector> vetcor:其实就是一个数组或者说是容器 其操作不同于之前直接定义的数组 > 而且可以直接赋值也可以直接 ...

随机推荐

  1. linux安装tomcat(转载:http://blog.csdn.net/zhuihunmiling/article/details/8977387)

    在安装Tomcat之前需要安装j2sdk(Java 2 Software Development Kit),也就是JDK 1.安装JDK完毕. 2.安装Tomcat 1)下载apache-tomcat ...

  2. vsftp配置主动模式和被动模式

    配置文件:/etc/vsftpd/vsftpd.conf 主动模式配置方法: 主动式连接使用的数据通道 connect_from_port_20=YES 支持数据流的被动式连接模式 pasv_enab ...

  3. COGS 445. [HAOI2010]最长公共子序列

    #include<iostream> #include<cstdio> #include<cstring> #define mod 100000000 #defin ...

  4. jQuery中在当前页面弹出一个新的界面

    W.$.dialog({ content:'url:wswgrkbillController.do?snh&id='+b+'&bh='+c+'&ck='+d+'&sl= ...

  5. ASP.NET MVC 几种 Filter 的执行过程源码解析

    一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神的工作,而且很多 人觉得平时根本不需要知道这些,会用就行了.其实阅读 ...

  6. iOS面试小题集锦

      1.Object-C有多继承吗?没有的话用什么代替? cocoa 中所有的类都是NSObject 的子类 多继承在这里是用protocol 委托代理 来实现的你不用去考虑繁琐的多继承 ,虚基类的概 ...

  7. Asp.net 导航条【1】

    PHP比较成熟的开放的源代码比较多,比方说PrestaShop,比方说Discuz!...... 虽然语言不同,但基本原理是一样的,有时间的话读一读,对学习ASP.NET应该是非常有好处的(唉,什么时 ...

  8. 你好,C++(31)我终于找到对象啦!6.1 从结构化设计到面向对象程序设计

    第6章 当C++爱上面向对象 很多第一次进入C++世界的人都会问:C++中的那两个加号到底是什么意思啊? C++是由C语言发展而来的,它比C语言多出的两个加号,实际上是C语言的自增操作符,表示C++语 ...

  9. 巧用Session Manager还原Firefox丢失会话

    今天Firefox Crash之后,我的会话全部丢失了.按照以往来说,Firefox在重新启动之后或者Crash之后会有一个会话还原的页面.但今天确实没有.后来我进行Google查阅,试了很多种办法. ...

  10. CentOS6.5 下 Mysql5.7主从复制

    包下载http://url.cn/WrNg5S 主数据库:192.168.161.129 从数据库1:192.168.161.130 从数据库1:192.168.161.138 MySQL安装地址:/ ...