STL中make_heap 的接口为:

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

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

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

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

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

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

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

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

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

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

Code:


#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector heap;
int n;
int main()
{
cout<<"Insert numbers of heap:";
cin>>n;
cout<<"Insert values of each members:\n";
for(int i=0;i<n;i++)
{
int read;
cin>>read;
heap.push_back(read);
}
make_heap(heap.begin(),heap.end());//大根堆
//make_heap(heap.begin(),heap.end(),greater());小根堆
cout<<"If there's something trouble,insert \"help\"!\n";
cout<<"Heap has neen maken!\nPlease insert commands:\n";
while(1)
{
string s;
cin>>s;
if(s=="pop")
{
pop_heap(heap.begin(),heap.end());
cout<<heap[heap.size()-1];
heap.pop_back();
cout<<endl;
}
else if(s=="push")
{
int read;
cin>>read;
heap.push_back(read);
push_heap(heap.begin(),heap.end());
}
else if(s=="top")
{
cout<<heap.front()<<endl;
}
else if(s=="sort")//奇怪的是,这里大根堆的堆排序是由小到大的(就是把数列逆转了)
{
vector temp;
temp=heap;
sort_heap(temp.begin(),temp.end());
for(int i=0;i<temp.size();i++)
cout<<temp[i]<<' ';
cout<<endl;
}
else if(s=="out")
{
for(int i=0;i<heap.size();i++)
cout<<heap[i]<<' ';
cout<<endl;
}
else if(s=="end")
{
return 0;
}
else if(s=="help")
{
cout<<"1.Pop the top number of heap,please insert \"pop\"!\n";
cout<<"2.Push a number into heap,please insert \"push numbers\"!\n";
cout<<"3.Look the top number of heap,please insert \"top\"!\n";
cout<<"4.Sort the heap and import result,please insert \"sort\"!\n";
cout<<"5.Look the array of heap,please insert \"out\"!\n";
cout<<"6.End the program,please insert \"end\"!\n";
}
else
cout<<"Bad Commands!"<<endl;
}
return 0;
}

算法库中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. [C++学习历程]基础部分 C++中的指针数组和结构

    作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/19938177 一.指针 对学习C++来说,指针是一项重要内容,以前,教 ...

  2. ROS_Kinetic_09 ROS基础内容(四)

    ROS_Kinetic_09 ROS基础内容(四) 参考网址: http://wiki.ros.org/cn/ROS/Tutorials/UsingRosEd http://wiki.ros.org/ ...

  3. Linux IPC实践(1) -- 概述

    进程的同步与互斥 进程同步: 多个进程需要相互配合共同完成一项任务. 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些 ...

  4. AngularJS中的依赖注入

    依赖注入 | Dependency Injection 原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所 ...

  5. (七)大图展示Demo引出的UIScrollView的使用

    UIScrollView是一个能够滚动的视图控件,可以通过滚动查看所有内容. 用途: 1.一张大图屏幕放不下,可以用各个方向的手势来看大图的各个部分. 2.手机的设置页面有很多的选项,需要上下滚动来查 ...

  6. Xcode中的调试工具栏简介

    如下图所示: 从左至右,第一个按钮用来隐藏调试区域. 第二个按钮向你展示断点是否被全局开启或禁用.如果它不是高亮蓝色,则没有断点会被触发. 第三个按钮暂停或继续程序的执行,你一般点击它继续运行到程序的 ...

  7. [FreeRadius2]遇到问题记录

    在学习FreeRadius2中遇到的问题,和解决. 使用的是2.2 版本,测试的系统是Centos6.7 radtest 没有响应 radiusd 启动正常,测试如下命令不好使 [root@orang ...

  8. 【一天一道LeetCode】#9. Palindrome Number

    一天一道LeetCode系列 (一)题目 Determine whether an integer is a palindrome. Do this without extra space. Some ...

  9. 【Java编程】Java学习笔记<一>

    1.  高级语言的编译和执行方法可以归为两大基本技术:编译执行和解释执行.C/C++/Delphi是编译执行,basic/java/matlab是解释执行. 2.    尽管Java是解释执行的,也需 ...

  10. Android性能优化之界面UI篇

    1.使用style.color.string.dimen样式来分离xml布局文件,减少代码的重复使用,增加代码复用率,防止hardcode,下面是一个例子: 在定义layout时候,因为每个View或 ...