C++ make_heap等堆函数的使用

news2024/11/19 16:23:44

一、介绍

C++的STL提供了make_heap、push_heap、pop_heap、sort_heap等算法,它们用来将一个随机存储的数组或者容器等转换为一个heap。这里所说的转换为heap意思是将原来的存储顺序改变,将转换成的堆层序遍历后所得到的元素顺序作为数组或者容器新的元素顺序(实质上就是对原来的数据用一个算法换了一下元素顺序)。

二、make_heap

make_heap()用于把一个可迭代容器变成一个堆,默认是大顶堆。
它有三个参数。第一个参数是指向开始元素的迭代器,第二个参数是指向最末尾元素的迭代器,第三个参数是less<>()或是greater<>(),前者用于生成大顶堆,后者用于生成小顶堆,第三个参数默认情况下为less<>(),less<int>()用于生成大顶堆。

template <class RandomAccessIterator>
	void make_heap(RandomAccessIterator first, RandomAccessIterator last);
	
template <class RandomAccessIterator, class Compare>
	void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

三、push_heap()

push_heap()是在堆的基础上进行数据的插入操作,参数与make_heap()相同,push_heap的功能是往堆中插入一个数据。但是,它的默认前提是区间[first, last - 2]已经满足堆结构,并且要插入的数据已经插入到区间的最后一个位置。因为STL库提供的push_heap算法没有插入元素,仅仅是完成插入元素后的调整工作,将插入元素后的区间恢复成堆结构。

我们需要注意,当一次性插入多个数据然后再调用push_heap进行调整的时候,除最后插入的数据之外的其他前面插入的数据必须保证和已有数据依然能够构成堆结构,因为push_heap只是对左闭右开区间的最后一个数据进行调整,并且认为前面的数据已经满足堆结构,所以如何前面插入的数据不能保证堆结构的话就会报错。

template <class RandomAccessIterator>
	void push_heap(RandomAccessIterator first, RandomAccessIterator last);
	
template <class RandomAccessIterator, class Compare>
	void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

 四、 pop_heap()

pop_heap的功能也是实现调整工作,但是是删除前的调整。pop_head会将堆顶的元素与最后一个元素(注意最后一个元素是last的上一个元素)交换,然后再调整,将除了最后一个元素的剩余其他元素重新恢复成堆结构。需要注意的是每次pop一个元素后,下一次pop时就需要将区间缩小1(last减1)。如果要删除这个元素,还需要对数组进行pop_back()操作。

五、使用

实例一

#include<iostream>
#include<vector>
#include<algorithm>
#include <queue>
#include <functional>
using namespace std;

void display(vector<int>q) {
	for (int i = 0; i < q.size(); i++) {
		cout << q[i] << " ";
	}
	cout << endl;
}

int main(){

	vector<int> q;
	for (int i = 0; i < 10; i++) {
		q.push_back(i);
	}
	make_heap(q.begin(), q.end(),less<int>()); // 大顶堆
	display(q);
	pop_heap(q.begin(), q.end(), less<int>());
	display(q);

	return 0;
}

 实例二

#include <iostream>
#include <vector>
#include <functional>

void display(vector<int> q) {
    for (int i = 0; i < q.size(); i++) {
        cout << q[i] << " ";
    }
    cout << endl;
}


int main()
{
    vector<int> v = { 5, 7, 9, 30, 4, 1, 0, 2 };
    display(v);
    cout << endl;

    //生成一个小堆
    make_heap(v.begin(), v.end(), greater<int>());
    display(v);
    cout << endl;

    for (int i = 0; i < v.size(); ++i)
        pop_heap(v.begin(), v.end() - i, greater<int>());
    display(v);
    cout << endl;

    system("pause");
    return 0;
}

 参考:

make_heap()等函数的用法 - 阳离子 - 博客园

heap算法函数—make_heap、push_heap、pop_heap和sort_heap_小-豪-豪的博客-CSDN博客_push_heap

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

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

相关文章

用HarmonyOS ArkUI调用三方库PhotoView实现图片的联播、缩放

本文演示如果用HarmonyOS的ArkUI来调用已经上架到三方库中心的社区库。体验HarmonyOS 3最新的API 9&#xff0c;欢迎大家一起参与构建这个万物互联的时代&#xff01; 活动主页 HarmonyOS线上Codelabs挑战赛已经开启&#xff0c;该系列挑战赛将围绕HarmonyOS的基础组件和容器…

ABAQUS计算不收敛问题,排查方法和解决方案都在这儿了

在进行有限元仿真计算时&#xff0c;常常会遇到计算不收敛的问题&#xff0c;而且导致求解不收敛的原因也是多种多样的&#xff0c;处理起来也是相当的麻烦。特别是在利用隐式算法的求解非线性问题时&#xff0c;对静态平衡方程进行迭代求解时极易出现计算的不收敛问题&#xf…

JVM垃圾回收——垃圾收集器(一)

目录 一、垃圾收集器 二、Serial/Serial Old 三、ParNew 收集器 四、Parallel Scavenge收集器 五、Parallel Old收集器 一、垃圾收集器 现阶段可以作为商用的垃圾收集器大概以上几种&#xff0c;ZGC还正在实验阶段&#xff0c;如果两个收集器之间有连线那么表示他们可搭配…

【Linux初阶】Linux环境下的 git 使用 | git的add/commit/push/log/pull/mv/rm/status

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;详细阐述git是什么&#xff0c;git的发展脉络&#xff0c;还有Linux环境下git工具的具体使用方法 &#x1f6a…

关于如何导入OTWB 7型项目

一、简介&#xff1a; 公司最新的 OTWB 7.0 产品&#xff0c;均使用最新版开发开发框架 ThornForest&#xff0c;简称 TF。相较于 Thorn 框架&#xff0c;新版的 TF 框架&#xff0c;在页面编译的方式有比较大的变化。其中最主要的变化是&#xff0c;TF 的编译需要根据不同部署…

深入理解JavaScript——执行上下文与调用栈

前言 在说一个概念前&#xff0c;我们需要确定它的前提&#xff0c;此文以 ECMAScript5 为基础撰写 一句话解释 执行上下文就是一段代码执行时所带的所有信息 执行上下文是什么 《重学前端》的作者 winter 曾经对什么是执行上下文做过这样的解释&#xff1a; JavaScript 标…

基于基于全局差错能量函数的双目图像立体匹配算法matlab仿真,并提取图像的深度信息

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 全局的能量函数公式如下: E(f)Edata(f)Esmooth(f) 其中,Edata 表示能量函数的数据项,意为该像素只考虑自身的视差值的倾向,不考虑 邻域内其他像素的影响;N 表示匹配聚合时的支持窗口;p 表…

应用层-HTTP协议

HTTP概述 HTTP(HyperTextTransferProtocol)是Web应用的应用层协议&#xff0c;定义浏览器如何向Web服务器发送请求以及Web服务器如何向浏览器进行响应。目前主要使用的HTTP/1.0 和HTTP/1.1&#xff0c;尤其以HTTP/1.1 为主流。 HTTP连接 浏览器在向服务器发送请求之前&#…

全日制和非全日制之争,看完六年前的这个文件心里就有数了

在每年的报考咨询中&#xff0c;都能接触到不少关于非全日制硕士的质疑&#xff0c;最大的争议点无非在于社会含金量的问题。其实很多年以前是没有非全日制这一说法的&#xff0c;早些年很多学员也是在职周末读的双证MBA/MPA/MEM这些专业&#xff0c;但证书一律是全日制标识&am…

Oracle Primavera Unifier进度管理器(Schedule Manager)

目录 功能介绍 功能包括 功能介绍 在进度管理器中&#xff0c;Primavera Unifier 用户可以在项目/外壳和项目群级别创建和管理进度表。他们可以创建根据项目或外壳的需求自定义的项目/外壳计划表。当他们为项目/外壳创建第一个时间表表时&#xff0c;Primavera Unifier 会自…

【软考】系统集成项目管理工程师(九)项目成本管理

这里写目录标题 一、项目成本管理概述二、项目成本管理子过程1. 规划成本2. 成本估算3. 制定预算4. 控制成本一、项目成本管理概述 成本 即项目的全过程中所耗用的各种成本,它们的总和为项目成本。成本管理 是在预算范围内确保项目团队完成一个项目所需要开展的管理过程,项目…

前端网页项目-学成在线案例

典型的企业级网站目的是为了整体感知企业级网站布局流程&#xff0c;复习以前知识 准备素材和工具&#xff1a; 学成在线PSD源文件开发工具PS&#xff08;切图&#xff09;/cutterman插件vscode&#xff08;代码&#xff09;chrome&#xff08;测试&#xff09; 案例准备工作&…

[附源码]java毕业设计健身健康规划系统

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

发布 .NET 7 MAUI / MAUI Blazor 应用到 Windows 应用商店

.NET MAUI 目前仅允许发布 MSIX 包。 原文地址 https://www.cnblogs.com/densen2014/p/16885318.html 创建签名证书发布到本地传送门 https://www.cnblogs.com/densen2014/p/16567384.html 使用 Visual Studio 2022 发布到 Windows 应用商店 由于是发布到 Windows 应用商店,本…

代码中可能会使用

代码中可能会使用 日志 结合兼具举报系统日志 https://www.cnblogs.com/lingduqianli/p/7589173.html 拦截器 https://blog.csdn.net/neymar_jr/article/details/79115839 拦截器应用场景 拦截器本质上是面向切面编程&#xff08;AOP&#xff09;&#xff0c;符合横切关注点…

MYSQL窗口函数(Rows Range)——滑动窗口函数用法

语法介绍 窗口函数语法&#xff1a; <窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名> rows/range子句<用于定义窗口大小> ) <窗口函数>可以放以下两种函数&#xff1a; 1&#xff09; 专用窗口函数&#xff0c;包括…

图文详解Linux基础经典教程(07)——CentOS安装Tomcat

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 之前&#xff0c;我们在CentOS中安装了JDK&#xff1b;接下来&#xff0c;我们在CentOS中安装Tomcat。 安装步骤 在此&#xff0c;详细介绍Tomcat的安装步骤。 第一…

上海亚商投顾:A股缩量调整 AIGC、Web3.0概念抢眼

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪三大指数今日震荡调整&#xff0c;深成指、创业板指午后均跌超1%&#xff0c;黄白二线有所分化&#xff0c;科创50指…

Django Celery异步任务队列

“ https://github.com/celery/celery” celery的GitHub源码文件 Celery是一个异步任务队列&#xff0c;需要python的环境&#xff0c;一般可用于python的web开发框架“食”用&#xff0c;例如Django。 场景 例如在自己开发网站时&#xff0c;写发送短信验证码的部分&#xff0…

Http不转换成Https会有什么后果?

自从互联网诞生以来&#xff0c;大家一开始接触的就是http站点&#xff0c;类似于http://域名&#xff0c;看习惯了也用习惯了。不过&#xff0c;随着人们网络安全意识的提高&#xff0c;越来越多的http站点已经被https站点所替代&#xff0c;逐年在增加。那么&#xff0c;http…