目录

一.make_heap(...)

二.push_heap(...)

三.pop_heap(...)

四.sort_heap(...)


这三个函数位于<algorithm>头文件中。

可以看这篇文章了解堆排序:手把手教你堆排序

一.make_heap(...)

这是该函数的官方定义:

这个函数用于建立堆。

前两个参数为迭代器类型,最后一个为仿函数,用于确定建堆方式。

默认使用大堆排序。

可以调用官方仿函数greater<T>,构建小堆排序,也可以自定义仿函数给参数comp。

使用方式如下:

int main()
{vector<int> arr = { 20, 43, 21, 1, 6, 30 };make_heap(arr.begin(), arr.end());//默认大堆cout << arr.front();//输出堆顶return 0;
}

二.push_heap(...)

官方定义:

这个用于将堆底数据加入堆结构中。

因为make_heap只能建堆,如果当前堆数据发生改变,就需要使用push_heap重回大堆/小堆。

值得注意:first 到 last-1 之间的元素必须满足堆结构。它仅仅是将last之前元素插入堆中。

意思就是,如果一次性插入多个元素,它只会把最后一个元素(堆底)加入堆结构中

其参数与make_heap相同,不再赘述。

使用方式如下:

int main()
{vector<int> arr = { 20, 43, 21, 1, 6, 30 };make_heap(arr.begin(), arr.end());arr.push_back(99);arr.push_back(79);push_heap(arr.begin(), arr.end());cout << "此时堆顶:" << arr.front() << endl;return 0;
}

 可以发现,99并没有成为堆顶元素,因为79才是最后一个插入的数据,99被“忽视”了,使用时要格外注意。

三.pop_heap(...)

官方定义:

该函数作用是“删除”堆顶元素。

为什么加引号——因为就像堆排序那样,所谓删除只是将堆顶元素移至堆底。

其实就是把first元素与last上一个元素交换位置。因为默认last指向堆底的下一个位置(空位置),就像vector的end()一样。

当然其参数与push_heap相同,不再赘述。

使用方式如下:

int main()
{vector<int> arr = { 20, 43, 21, 1, 6, 30 };make_heap(arr.begin(), arr.end());//建大堆cout << "原堆顶:" << arr.front() << endl;pop_heap(arr.begin(), arr.end());cout << "此时堆顶:" << arr.front() << endl;cout << "此时堆底:" << arr.back();return 0;
}

四.sort_heap(...)

官方定义:

该函数就是堆排序。

但前提是该结构在调用sort_heap前已经是堆结构。

sort_heap内部只是把堆顶放堆底,然后再排堆,再取堆顶到新堆底,...直到排完。

同样,参数不再赘述,与之前一致。

重点还是使用:

int main()
{vector<int> arr = { 20, 43, 21, 1, 6, 30 };make_heap(arr.begin(), arr.end());//确保排序前已是堆结构sort_heap(arr.begin(), arr.end());for (auto n : arr)cout << n << " ";return 0;
}

//错误代码
int main()
{vector<int> arr = { 20, 43, 21, 1, 6, 30 };//排序前不是堆结构sort_heap(arr.begin(), arr.end());for (auto n : arr)cout << n << " ";return 0;
}

直接报错。


如有错误,敬请斧正

C++语法——make_heap、push_heap、pop_heap、sort_heap使用介绍相关推荐

  1. make_heap(),push_heap(),pop_heap(),sort_heap()用法。

    #include <iostream> #include <algorithm> using namespace std;        //一般而言设计的时候都是从零开始的. ...

  2. C++ 最大堆最小堆与push_heap pop_heap

    make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...

  3. [转载] Python基本语法之:字符串和字典介绍

    参考链接: Python中有关字符串的有趣事实 2(Slicing切片) 字符串(Strings) Python语言真正出色的地方之一是字符串的操作.本节将介绍Python的一些内置字符串方法和格式化 ...

  4. 英语语法---四种句子类型的介绍

    英语语法 句子-四种句子类型的介绍 1. 陈述句(Declarative Sentence) 1.1 肯定句 1.2 一般否定句 2. 感叹句(Exclamatory) 2.1 What引导的感叹句 ...

  5. 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向

    1. JSP简单内容 1.1 JavaEE JavaEE 包含JSP JavaEE是一个开发分布式企业级应用的规范和标准.JavaEE包含之前学过的所有内容(JavaSE) 真正开发中,很少使用Jav ...

  6. POJ 3784.Running Median

    2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...

  7. 第四章 序列式容器(sequence containers)

    序列式容器(sequence containers) 1.容器的概观与分类 2.vector 3.list 4.deque 5.stack 6.queue 7.heap(隐私表述,implicit r ...

  8. 【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)

    C++ 泛型编程 中的泛型算法和STL(sort,find,find) 1. 引言 1.1 简述泛型编程和STL的重要性 1.2 介绍泛型算法的基本概念 2. STL中的泛型算法 2.1 定义及主要特 ...

  9. 【STL学习】优先级队列Priority Queue详解与C++编程实现

    优先级队列Priority Queue介绍 优先级队列是一个拥有权值观念的queue.它允许在底端添加元素.在顶端去除元素.删除元素. 优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的 ...

最新文章

  1. 在线作图|如何绘制一张哑铃图
  2. 老铁666,快手突然“快”不动了?
  3. c#快捷键(成为高手必备)
  4. 002---tcp/ip五层详解
  5. SAP Fiori 1.0和2.0的区别
  6. mysql where条件使用了or会不会扫全表
  7. webpack vue router import() 打包后单个js文件名称自定义
  8. 初学oracle遇到些小麻烦
  9. mfc实验报告心得体会_mfc实验报告.doc
  10. C/C++创建服务器和客户端的demo
  11. 全国DNS服务器IP地址【电信、网通、铁通】
  12. windows资源管理器对文件右键未响应!电脑小白求救[哭唧唧]!!!
  13. Java基础--数组的认识(通透!!!)
  14. yyds、yygq、xswl...都是什么意思?
  15. Excel - 如何在 Excel 表格的一个单元格内换行?
  16. 数据加密 RSA非对称加密篇
  17. 如何监控ActiveMQ
  18. 【Centos7 NTP 服务器和客户端配置(含离线状态) 附赠手动配置系统时间】
  19. win8通过u盘装linux系统文件下载,U盘安装纯净版WIN8方法步骤介绍
  20. C语言实现超长整数减法

热门文章

  1. 中小学计算机创新教育措施,创新教育在计算机教学中的问题与对策
  2. 两根香怎么测15分钟?
  3. mysql 虚拟数据库_虚拟mysqli数据库
  4. 关于2006年度全国土地登记代理人职业资格考试工作的通知
  5. 使用 URLConnection 提交请求
  6. ad频谱分析 matlab_MATLAB信号频谱分析FFT详解
  7. PCIe各版本结构剖析
  8. 小白量化彩票实战(7)用sklearn神经网络预测彩票号码和特征
  9. 返回时上一界面仍保持之前的内容
  10. 如何 退出ThunderPlatform.exe进程