STL中make_heap 的接口为:

default (1)
  1. template <class RandomAccessIterator>
  2. void make_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
  1. template <class RandomAccessIterator, class Compare>
  2. void make_heap (RandomAccessIterator first, RandomAccessIterator last,
  3. Compare comp );

默认的使用operator< 进行比较。而我们可以自定义comp进行比较,来进行建堆。

其中,两个make_heap所使用的参数,[first,last)     这个区间是半开半闭的。

当我们需要对堆进行存取操作时,我们有函数,pos_heap,push_heap

default (1)
  1. template <class RandomAccessIterator>
  2. void pop_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
  1. template <class RandomAccessIterator, class Compare>
  2. void pop_heap (RandomAccessIterator first, RandomAccessIterator last,
  3. Compare comp);

使用pop_heap 操作后, 最大值被移动到last-1的位置。[first ,last-1) 之间的元素继续保持堆的形态。

我们只需取出最后一个元素即可。也就是vec.pop_back();

default (1)
  1. template <class RandomAccessIterator>
  2. void push_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
  1. template <class RandomAccessIterator, class Compare>
  2. void push_heap (RandomAccessIterator first, RandomAccessIterator last,
  3. Compare comp);

执行push_heap 时, [first,last-1)个元素是保持堆形态的,如果不是堆,则会报错。

这个函数是相当于对堆进行调整。

Code:


  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<vector>
  6. using namespace std;
  7. vector heap;
  8. int n;
  9. int main()
  10. {
  11. cout<<"Insert numbers of heap:";
  12. cin>>n;
  13. cout<<"Insert values of each members:\n";
  14. for(int i=0;i<n;i++)
  15. {
  16. int read;
  17. cin>>read;
  18. heap.push_back(read);
  19. }
  20. make_heap(heap.begin(),heap.end());//大根堆
  21. //make_heap(heap.begin(),heap.end(),greater());小根堆
  22. cout<<"If there's something trouble,insert \"help\"!\n";
  23. cout<<"Heap has neen maken!\nPlease insert commands:\n";
  24. while(1)
  25. {
  26. string s;
  27. cin>>s;
  28. if(s=="pop")
  29. {
  30. pop_heap(heap.begin(),heap.end());
  31. cout<<heap[heap.size()-1];
  32. heap.pop_back();
  33. cout<<endl;
  34. }
  35. else if(s=="push")
  36. {
  37. int read;
  38. cin>>read;
  39. heap.push_back(read);
  40. push_heap(heap.begin(),heap.end());
  41. }
  42. else if(s=="top")
  43. {
  44. cout<<heap.front()<<endl;
  45. }
  46. else if(s=="sort")//奇怪的是,这里大根堆的堆排序是由小到大的(就是把数列逆转了)
  47. {
  48. vector temp;
  49. temp=heap;
  50. sort_heap(temp.begin(),temp.end());
  51. for(int i=0;i<temp.size();i++)
  52. cout<<temp[i]<<' ';
  53. cout<<endl;
  54. }
  55. else if(s=="out")
  56. {
  57. for(int i=0;i<heap.size();i++)
  58. cout<<heap[i]<<' ';
  59. cout<<endl;
  60. }
  61. else if(s=="end")
  62. {
  63. return 0;
  64. }
  65. else if(s=="help")
  66. {
  67. cout<<"1.Pop the top number of heap,please insert \"pop\"!\n";
  68. cout<<"2.Push a number into heap,please insert \"push numbers\"!\n";
  69. cout<<"3.Look the top number of heap,please insert \"top\"!\n";
  70. cout<<"4.Sort the heap and import result,please insert \"sort\"!\n";
  71. cout<<"5.Look the array of heap,please insert \"out\"!\n";
  72. cout<<"6.End the program,please insert \"end\"!\n";
  73. }
  74. else
  75. cout<<"Bad Commands!"<<endl;
  76. }
  77. return 0;
  78. }

算法库中heap应用的更多相关文章

  1. C++神奇算法库——#include<algorithm>

    算法(Algorithm)为一个计算的具体步骤,常用于计算.数据处理和自动推理.C++ 算法库(Algorithms library)为 C++ 程序提供了大量可以用来对容器及其它序列进行算法操作的函 ...

  2. mahout算法库(四)

    mahout算法库 分为三大块 1.聚类算法 2.协同过滤算法(一般用于推荐) 协同过滤算法也可以称为推荐算法!!! 3.分类算法 算法类 算法名 中文名 分类算法               Log ...

  3. STL笔记(6)标准库:标准库中的排序算法

    STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...

  4. 8、泛型程序设计与c++标准模板库4.标准c++库中的算法

    标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够 ...

  5. scikitlearn库中调用k-近邻算法的操作步骤

    1.k近邻算法可以说是唯一一个没有训练过程的机器学习算法,它含有训练基础数据集,但是是一种没有模型的算法,为了将其和其他算法进行统一,我们把它的训练数据集当做它的模型本身.2.在scikitlearn ...

  6. 安装Python算法库

    安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...

  7. scikit-learn 支持向量机算法库使用小结

    之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结.scikit-learn SVM算法库封装了libsvm ...

  8. scikit-learn 线性回归算法库小结

    scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ...

  9. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

随机推荐

  1. 【IOS 开发】Object-C 运算符

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41624613 1. 算术运算符 算术运算符 : 加(+), 减(-), 乘(*), ...

  2. html倒计时代码

    <SPAN id=span_dt_dt></SPAN> <SCRIPT language=javascript> <!-- //document.write( ...

  3. Java数组排序基础算法,二维数组,排序时间计算,随机数产生

    import java.util.Arrays; //包含Arrays import java.util.Random; public class HelloWorld { public static ...

  4. 【一天一道LeetCode】#99. Recover Binary Search Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Two ele ...

  5. Libgdx 1.6.1发布,跨平台游戏开发框架

    Libgdx 1.6.1发布 [1.6.1] 英文原文:http://www.badlogicgames.com/wordpress/?p=3694 译文翻译:宋志辉 - Net.newServerS ...

  6. 【翻译】从Store生成Checkbox Group

    原文:Ext JS: Generating a Checkbox Group from a Store Ext JS的checkbox group可以用来将复选框组合成一个单一的逻辑字段.由于复选框时 ...

  7. spring mvc接收List集合、JUI传JSP List

    JUI页面是这样的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <div class=&quo ...

  8. 9.6、Libgdx之罗盘

    (官网:www.libgdx.cn) 有些Android和iOS设备可能需要检测使用罗盘检测方向. 注意:罗盘当前在iOS设备中不可用,RoboVM暂不支持. 查询当前罗盘当前是否可用: boolea ...

  9. Java图形界面编程生成exe文件

    1. 先将代码打成jar,然后使用exe4j转成exe ext4j下载 链接:http://pan.baidu.com/s/1kTCIZtX 密码:pvj1 打开EXE4J Advanced Opti ...

  10. Caffe + Ubuntu 15.04 + CUDA 7.0 安装以及配置

    作为小码农的我,昨天就在装这个东东了,主要参考第一篇博文,但是过程发现很多问题,经过反反复复,千锤百炼,终于柳暗花明,我把这个caffe给搞定了,是故,我发布出来,后之来者,欲将有感于斯文~ 本分分为 ...