了解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

相关文章

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3