了解C++中STL的堆操作:构建、拆解和排序 堆(Heap)

在C++中使用STL构建、拆解和排序堆

  • 一、简介
  • 二、std::push_heap
  • 三、std::pop_heap
  • 四、std::sort_heap
  • 五、总结

一、简介

首先要要熟悉堆(Heap)是什么以及它们是如何工作的,如果你不知道什么是堆(Heap),可以先阅读前面的文章,再来看这篇文章会更好。

好了,现在假设你已经清楚堆(Heap),可以使用C++的STL来构建堆、拆解堆和对堆进行排序。

以一个堆(Heap)的例子开始:
在这里插入图片描述

这是一个最大堆,最大的元素在顶部。我们将插入一个元素(这与C++并没有太大关系),它是如何在堆数据结构中插入一个元素。

二、std::push_heap

在堆的末尾添加8.8。这并不是它正确的位置,所以将使它通过堆向上移动。将它与其父元素进行比较,每当它大于其父元素时,就对它们进行交换:
堆 C++ STL

这样它最终会到达它的最终位置。

在C++中,堆被表示为连续的结构,例如在std::vector中。因此,将这个堆压缩成一个数组。

现在要添加一个元素,将在向量的末尾push_back这个元素,并调用std::push_heap,使这个最后一个元素向其最终位置在堆中向上移动:

std::vector myHeap = // ... 有关std::make_heap,请参见前面的文章
myHeap.push_back(8.8);
std::push_heap(begin(myHeap), end(myHeap));

三、std::pop_heap

那么如何从堆中删除一个元素?只能删除一个元素,即顶部的元素。为了做到这一点,可以使用std::pop_heap。它首先将想要删除的第一个元素与最小的其中一个元素(即最后一个元素)进行交换。

然后,它将使这个小元素在堆中向下移动到其最终位置,通过与其子元素进行比较。每当它小于其中一个子元素时,将它与其最大的子元素交换,以确保能够保持堆的特性。
堆 C++ STL

为了实际去掉曾经在堆顶的元素,它现在位于verctor中的最后位置,在vector上执行一个pop_back

std::pop_heap(begin(myHeap), end(myHeap));
myHeap.pop_back();

四、std::sort_heap

仔细思考以下,如果重复执行std::pop_heap操作但不把vector中的元素取出来,那么顶部的元素就会按排序顺序堆积在vector的末尾。
这样做的次数越多,堆中的元素就越多,最终得到的是一个排序好的vector,不再有堆(Heap)。

这基本上是std::sort_heap所做的事情:

std::sort_heap(begin(myHeap), end(myHeap));

它接收一个堆并对其进行排序,其复杂度最大为2*N*log(N)

五、总结

以上就是使用STL操纵堆(Heap)的全部内容。这里看到了如何使用std::push_heap构建堆,如何使用std::pop_heap拆解堆,以及如何使用std::sort_heap对堆进行排序。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库——SQL SERVER(先学删库跑路)

目录 一:什么是数据库 二:为什么需要数据库 三:数据库的安装 四:学前必备知识 1. 数据库原理 2. 数据库与编程语言 3. 数据库与数据结构的区别 4. 连接 5. 有了编程语言为啥还要数据库 6. 初学者学习数据库的三个方面 …

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解…

【GlobalMapper精品教程】082:WGS84/CGCS2000转阿尔伯斯(Albers)投影

参考阅读: ArcGIS实验教程——实验十:矢量数据投影变换 【ArcGIS Pro微课1000例】0024:自定义坐标系统—以阿尔伯斯投影(Albers)为例 【ArcGIS风暴】ArcGIS自定义坐标系统案例教程—以阿尔伯斯投影(Albers)为例 文章目录 一、加载实验数据二、设置输出坐标系三、数据导出…

基于C#开发web网页管理系统模板流程-登录界面

前言,首先介绍一下本项目将要实现的功能 (一)登录界面 实现一个不算特别美观的登录窗口,当然这一步跟开发者本身的设计美学相关,像蒟蒻博主就没啥艺术细胞,勉强能用能看就行…… (二&#xff09…

mikefile函数与实用模板

文章目录 0.概述1.函数调用语法2.字符串处理函数2.1 subst(字符串替换函数)2.2 patsubst(模式字符串替换函数)2.3 strip(去空格函数)2.4 findstring(查找字符串函数)2.5 filter&…

企业网站HTTP网站业务被慢连接攻击了该怎么办

企业的网站建设中遇到网络攻击会出现哪些问题?一些中小型企业对于网络安全的认知不足,网站建设种类众多,电子商城类,小型游戏,支付类型,H5页面的网站,开发等等,如遇见网络攻击造成的…

vue3专栏项目 -- 四、前后端结合(下)

一、async 和 await 1、使用async 和 await 改造异步请求 在接触后端API以后就遇到了越来越多的异步请求,现在我们就使用async 和 await 改造异步请求。 async function是把返回内容包裹成个Promise返回Promise await 它在async function里面才起作用&#xff0…

大厂常见算法50题-两数相加

专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法! 文章目录 题目解法总结 题目 解法 定义一个节点pre,用于初始化结果链表的头部,cur指向pre,它将在遍历过程中用于构建新的链表。初始化进位变…

Linux实验 Shell编程

实验目的: 熟练掌握Shell程序的建立与执行;掌握Shell变量的两种类型(Shell环境变量和用户自定义变量)及其用法;掌握Shell中的特殊字符、算术与逻辑运算;掌握Shell中输入输出命令;掌握Shell程序…

学术共振 美妙发声 | 2024美沃斯大会完美收官,米兰柏羽倾力承办

5月10日-5月12日,为期3天的第十七届美沃斯医疗美容大会在杭州国际博览中心盛大举办,作为行业顶级学术交流平台,本届美沃斯大会不仅是医美行业的一次学术交流盛会,更是一次深度探讨行业未来的远眺之窗。 5月9日,即美沃…

Docker 安装 MySQL(Mac电脑M芯片)

Docker 安装 MySQL(Mac电脑M芯片) 1. 下载MySQL镜像文件2. 创建容器实例2.1 命令参数介绍 3. 容器实例内连接MySQL3.1 进入容器实例后台3.2 连接MySQL 4. DBeaver连接MySQL4.1 连接异常 1. 下载MySQL镜像文件 # 默认下载laster版本 docker pull mysql# …

MPEG-4 AVC/H.264高清编码器 JR3211P

概述 JR3211P MPEG-4 AVC/H.264高清编码器是一款专业的高清音/视频编码产品。该产品支持几乎所有模拟及数字音/视频输入接口,包括CVBS、YPbPr、S-video、SD/HD-SDI、HDMI视频输入接口、平衡模拟音频(XLR)、非平衡模拟音频(RCA&am…