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

2024-05-14 09:44

本文主要是介绍了解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对堆进行排序。

在这里插入图片描述

这篇关于了解C++中STL的堆操作:构建、拆解和排序 堆(Heap)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988413

相关文章

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格