C++语法——make_heap、push_heap、pop_heap、sort_heap使用介绍
目录
一.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使用介绍相关推荐
- make_heap(),push_heap(),pop_heap(),sort_heap()用法。
#include <iostream> #include <algorithm> using namespace std; //一般而言设计的时候都是从零开始的. ...
- C++ 最大堆最小堆与push_heap pop_heap
make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...
- [转载] Python基本语法之:字符串和字典介绍
参考链接: Python中有关字符串的有趣事实 2(Slicing切片) 字符串(Strings) Python语言真正出色的地方之一是字符串的操作.本节将介绍Python的一些内置字符串方法和格式化 ...
- 英语语法---四种句子类型的介绍
英语语法 句子-四种句子类型的介绍 1. 陈述句(Declarative Sentence) 1.1 肯定句 1.2 一般否定句 2. 感叹句(Exclamatory) 2.1 What引导的感叹句 ...
- 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向
1. JSP简单内容 1.1 JavaEE JavaEE 包含JSP JavaEE是一个开发分布式企业级应用的规范和标准.JavaEE包含之前学过的所有内容(JavaSE) 真正开发中,很少使用Jav ...
- POJ 3784.Running Median
2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...
- 第四章 序列式容器(sequence containers)
序列式容器(sequence containers) 1.容器的概观与分类 2.vector 3.list 4.deque 5.stack 6.queue 7.heap(隐私表述,implicit r ...
- 【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
C++ 泛型编程 中的泛型算法和STL(sort,find,find) 1. 引言 1.1 简述泛型编程和STL的重要性 1.2 介绍泛型算法的基本概念 2. STL中的泛型算法 2.1 定义及主要特 ...
- 【STL学习】优先级队列Priority Queue详解与C++编程实现
优先级队列Priority Queue介绍 优先级队列是一个拥有权值观念的queue.它允许在底端添加元素.在顶端去除元素.删除元素. 优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的 ...
最新文章
- 在线作图|如何绘制一张哑铃图
- 老铁666,快手突然“快”不动了?
- c#快捷键(成为高手必备)
- 002---tcp/ip五层详解
- SAP Fiori 1.0和2.0的区别
- mysql where条件使用了or会不会扫全表
- webpack vue router import() 打包后单个js文件名称自定义
- 初学oracle遇到些小麻烦
- mfc实验报告心得体会_mfc实验报告.doc
- C/C++创建服务器和客户端的demo
- 全国DNS服务器IP地址【电信、网通、铁通】
- windows资源管理器对文件右键未响应!电脑小白求救[哭唧唧]!!!
- Java基础--数组的认识(通透!!!)
- yyds、yygq、xswl...都是什么意思?
- Excel - 如何在 Excel 表格的一个单元格内换行?
- 数据加密 RSA非对称加密篇
- 如何监控ActiveMQ
- 【Centos7 NTP 服务器和客户端配置(含离线状态) 附赠手动配置系统时间】
- win8通过u盘装linux系统文件下载,U盘安装纯净版WIN8方法步骤介绍
- C语言实现超长整数减法