C++语法——make_heap、push_heap、pop_heap、sort_heap使用介绍

news2025/7/8 23:36:32

目录

一.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;
}

直接报错。


如有错误,敬请斧正 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/6747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux日志管理logrotate日志轮转

文章目录 前言 日志轮转简介 工作原理 配置文件种类 观察主文件和子文件 主配置文件介绍 yum日志轮转示例 配置轮转规则 rotate 3演示 总结 前言 上篇文章学习了系统日志管理&#xff0c;对于日志来讲他是占内存的&#xff0c;当有大量的日志产生的时候&#xff0c;会…

一个简单HTML5期末考核大作业,学生个人html静态网页制作代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

m基于PSO粒子群优化的第四方物流的作业整合算法matlab仿真,对比有代理人和无代理人两种模式下最低运输费用、代理人转换费用、运输方式转化费用和时间惩罚费用

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 粒子群优化 (PSO)算法是通过模拟鸟群觅食过程中的迁徙和群聚行为而提出的一种基于群体智能的全局随机搜索算法。PSO是将群体(swarm)中的个体看作是在D维搜索空间中没有质量和体积的粒子(part…

Paddle入门实战系列(一):基于PaddleOCR的车牌识别

✨写在前面&#xff1a;强烈推荐给大家一个优秀的人工智能学习网站&#xff0c;内容包括人工智能基础、机器学习、深度学习神经网络等&#xff0c;详细介绍各部分概念及实战教程&#xff0c;通俗易懂&#xff0c;非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…

MySQL十秒插入百万条数据

mysql数据库准备 private String Driver "com.mysql.cj.jdbc.Driver";private String url "jdbc:mysql://localhost:3306/mp?serverTimezoneAsia/Shanghai&rewriteBatchedStatementstrue";private String user "root";private String pa…

Pycharm 翻译插件失效(transaction) 问题解决【包括安装视频教程】

嗨害大家好鸭&#xff01;我是小熊猫❤ 最近有很多朋友反应 翻译插件用不了了(不想看文章的朋友 可以直接点击文章最下方QQ群 领取视频版教程) 那么今天&#xff01;&#xff01;&#xff01; 教大家如何快速解决这个问题 点击文件(file) —> 设置(setting) 点击工具(t…

【附源码】计算机毕业设计JAVA家庭园艺服务平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

【Node.js】 第四章 模块化

目录 1. 模块化的概念 1.1 模块化的概念 1.2 模块化规范 2. Node.js中的模块化 2.1 模块分类 2.2 模块加载 2.3 模块作用域 2.4 向外共享模块成员 2.5 exports对象 2.6 Node.js中的模块化规范 1. 模块化的概念 1.1 模块化的概念 按照模块指定规则&#xff0c;把一…

什么是智能合约?新手入门指南

智能合约&#xff0c;也称为数字合约&#xff0c;在计算机网络中使用区块链技术来履行预编程的合约当合同的条件得到满足时&#xff0c;智能合同就会执行&#xff0c;例如向合同的一方发送付款。 智能合约之所以具有吸引力有多种原因&#xff1a; 不信任。由于智能合约及其条…

【c++ 】 对象与类中方法的调用关系。类中常方法,普通方法,静态方法之间互相的调用关系

对象与类中方法的调用关系。类中常方法&#xff0c;普通方法&#xff0c;静态方法之间互相的调用关系1.对象与方法之间的调用1.常对象只能调用常成员方法2.普通对象既可以调用普通成员方法&#xff0c;也可以调用常成员方法&#xff0c;当两个同名的常成员方法和普通成员方法重…

你安全吗?丨秦淮到底是哪种黑客?你猜对了吗?

作者&#xff1a;黑蛋 大家都知道黑客&#xff0c;但是黑客也分很多种类&#xff0c;那么秦淮属于哪种黑客呢&#xff0c;我们先来看一看黑客的种类&#xff1a; 1、白帽黑客&#xff1a;白帽黑客是指通过实施渗透测试&#xff0c;识别网络安全漏洞&#xff0c;为政府及组织工…

蓝桥杯入门即劝退(九)罗马数字

“为什么你没有变强&#xff0c;因为你最近一直过得太舒服” ----------持续更新蓝桥杯入门系列算法实例------------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章对你有…

数字孪生3d智慧核电可视化场景应用展示,包括:智能计算,智能运维

最近几年来&#xff0c;数字孪生技术已被应用于核电领域&#xff0c;并且国内已有一些公司在具体实践过程中&#xff0c;通过数字孪生赋能核电更加经济、灵活、高效运维。 北京智汇云舟科技有限公司成立于2012年&#xff0c;专注于创新性的“视频孪生&#xff08;实时实景数字孪…

c++ 正则表达式

文章目录正则表达式基本语句regex_matchregex_searchregex_token_iteratorregex_replace示例匹配电话号码匹配QQ号码匹配IP地址正则表达式 什么是正则表达式&#xff1f; 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0…

GENERALIZATION THROUGH MEMORIZATION: NEAREST NEIGHBOR LANGUAGE MODELS

Abatract 我们引入了kNN-LMs&#xff0c;它扩展了一个预先训练的神经语言模型&#xff08;LM&#xff09;&#xff0c;通过与k个最近邻&#xff08;kNN&#xff09;模型线性插值。最近邻是根据预先训练好的LM嵌入空间中的距离进行计算的&#xff0c;并可以从任何文本集合中提取…

45-命令行基础操作

45-命令行基础操作LInux命令行基础LInux命令基础知识Linux的Gul与CLI为什么使用Linux命令行Linux命令语法格式Linux命令分类LInux基础命令登录命令电源管理命令电源命令1: shutdown电源命令2: halt电源命令3: reboot文件管理命令Linux文件目录结构(1)Linux文件路径帮助命令目录…

Vue+Vite+TS

目录#、基础配置1、安装Node.js2、修改npm镜像源3、配置vscode一、创建项目二、Ref全家桶三、computed计算属性js中数组使用的高阶函数四、watch监听器#、基础配置 1、安装Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/download/ 安装成功&#xff0c;查看版本node …

vue create 创建项目的时候遇到使用nvm切换node后 提示‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

前景:我是用的是nvm切换的node版本&#xff0c;不是直接安装高级版本node,有nvm同样困惑的可以用以下方式解决问题&#xff0c;加油&#xff01;&#xff01;&#xff01; 报错: ‘vue’ 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方法: 1.检查node和npm nod…

libvirt 使用UEFI 设置 edk2-ovmf

一、ovmf 与 edk2 关系&#xff1a; 英特尔EFI开发工具包II (edk2)的子项目&#xff0c;所以在edk2 源码中也能找到 ovmf 部分&#xff0c;ovmf 使UEFI支持Ia32和X64虚拟机 二、OVMF_VARS.fd 与 OVMF_CODE.fd&#xff1a; 1、变量存储和固件的可执行文件&#xff1b; 2、OVMF_…

【数据结构与算法】单链表的增删查改(代码+图解)

目录 顺序表和链表的特点&#xff1a; 时间复杂度&#xff1a; 分析&#xff1a; 单链表结构体和数据类型&#xff1a; 开辟一个节点和存储数据&#xff1a; 打印 尾插 尾删 头插 头删&#xff1a; 查找单链表中的元素 在pos后插入x 在pos前插入x 删除pos后的一个…