C++ 堆2025年5月23日 | 阅读 11 分钟 在 C++ 中,堆是一种主要用于优先队列和高效检索最大或最小元素的树形数据结构。C++ STL 提供了许多用于堆操作的内置函数,例如 make_heap()、push_heap()、pop_heap()、sort_heap()、is_heap 和 is_heap_until()。 堆也称为自由存储区,它指的是程序运行时用于动态分配的内存区域。使用 new 或 malloc() 运算符时,内存会从该区域分配。如果我们使用最新的 new 或 malloc() 运算符,内存将从该部分获取。 C++ 中的堆类型在 C++ 中,堆主要可分为两种类型。
有时,这些堆通常应用于各种算法,例如优先队列、排序算法和其他图算法。此库的功能包括与堆相关的函数,但可以根据比较器将其设置为充当最小堆或最大堆。 最大堆 (Max-Heap)在 C++ 中,最大堆 (Max-Heap) 是一种二叉堆,其中任何节点的键都大于或等于其子节点的键。换句话说,最大的元素位于根节点,并且最大堆的所有子树也遵循最大堆属性。 最大堆的特性C++ 中最大堆的几个特性如下:
最大堆的用例C++ 中最大堆的几个用例如下:
C++ 最大堆示例让我们举一个例子来说明 C++ 中的最大堆。 示例编译并运行输出 Max Heap: 40 30 15 10 20 说明 在此示例中,我们演示了如何使用 STL 的 make_heap() 函数创建最大堆。它初始化一个包含元素的向量,将其转换为最大堆(其中最大元素位于前面),然后打印已堆化的向量。 最小堆 (Min-Heap)在 C++ 中,最小堆 (Min-Heap) 是一个项的集合,它与二叉堆具有相似的属性,但遵循任何父节点键小于或等于其子节点键的条件。它确保最小的元素始终位于堆的根节点。此外,最小堆中的每个子树也必须满足此属性,这使其可用于多种操作,包括检索或删除最小元素。 最小堆的特性C++ 中最小堆的几个特性如下:
用例C++ 中最小堆的几个用例如下:
C++ 最小堆示例为了在 C++ 中使用最小堆,我们可以使用一个自定义比较器来定义顺序。 示例编译并运行输出 Min Heap: 10 20 15 30 40 说明 在此示例中,我们使用 greater<int>() 比较器通过 make_heap() 从向量创建了一个最小堆,该比较器可确保最小元素位于堆的前面。之后,按堆结构顺序打印元素。 我们为什么要使用 C++ 中的堆?以下是我们使用 C++ 中堆的一些原因。 1) 动态大小 这意味着,当对象或数组的大小在编译时无法确定时,堆会根据用户输入或其他条件来分配内存。 2) 更长的生命周期 在 C++ 中,堆内存一直被使用,直到被显式释放。当对象需要比创建它们的函数更长的生命周期时,这一点尤其有用。 3) 灵活的数据结构 单向链表、树、图和哈希表以及其他复杂的数据结构由于其动态性都需要堆分配。 4) 有效利用内存 堆内存用于处理大数据并克服栈溢出情况,尤其是在递归算法或大型数据集的情况下。 C++ STL 中的堆函数下表显示了 C++ STL 中的不同函数。它们如下:
C++ STL 中的堆操作C++ STL 中有几种堆操作。其中一些操作如下: 1) make_heap() - 将向量转换为堆在 C++ 中,make_heap() 函数用于将给定范围转换为堆。默认情况下,它会创建一个最大堆,其中最大元素位于范围的前面。 语法 它具有以下语法: 在此语法中,提供的迭代器应为 randomAccessIterator 类型。 C++ make_heap() 示例让我们举一个例子来说明 C++ 中的 make_heap() 函数。 示例编译并运行输出 Max heap: 30 10 20 5 1 说明 在此示例中,我们使用了 make_heap() 函数,该函数可以排列元素,使最大值位于向量的前面。之后,它打印向量的堆结构化内容。 2) push_heap() - 向堆添加新元素在 C++ 中,push_heap() 函数用于插入一个新元素,同时保持堆的顺序。 语法 它具有以下语法: C++ push_heap 示例让我们举一个例子来说明 C++ 中的 push_heap() 函数。 示例编译并运行输出 After push_heap: 30 25 10 20 说明 在此示例中,我们使用 make_heap() 函数将向量转换为堆。之后,使用 push_back() 添加一个新元素 (25),并调用 push_heap() 来维护堆属性。 3) pop_heap() - 移除根 (最大元素)在 C++ 中,pop_heap() 函数用于将堆的最大元素移动到范围的末尾并恢复堆的顺序。 语法 它具有以下语法: C++ pop_heap() 示例让我们举一个例子来说明 C++ 中的 pop_heap() 函数。 示例编译并运行输出 After pop_heap: 40 20 30 10 说明 在此示例中,我们使用 make_heap() 函数将向量 v 组织成一个最大堆。之后,pop_heap() 函数将最大元素(堆的根)移动到向量的末尾。v.pop_back() 函数从容器中移除最大元素。 4) sort_heap() - 将堆转换为排序数组在 C++ 中,sort_heap() 函数用于将堆转换为升序排序的范围。 语法 它具有以下语法: C++ sort_heap() 示例让我们举一个例子来说明 C++ 中的 sort_heap() 函数。 示例编译并运行输出 Sorted: 1 5 10 20 30 说明 在此示例中,我们使用 make_heap() 函数将向量 v 重排为最大堆。之后,sort_heap() 函数通过反复将最大元素移到末尾并减小堆大小来将堆排序为升序。 5) is_heap() - 检查范围是否为堆在 C++ 中,is_heap() 函数用于检查提供的范围是否为堆。如果范围是有效堆,则返回 true;否则返回 false。 语法 它具有以下语法: C++ is-heap 示例让我们举一个例子来说明 C++ 中的 is_heap 函数。 示例编译并运行输出 This is a heap. 说明 在此示例中,我们取向量 {30, 20, 10},它是一个有效的最大堆,因为每个父节点都大于或等于其子节点。is_heap(v.begin(), v.end()) 函数返回 true,因此程序打印“这是一个堆”。 6) is_heap_until() - 检查直到不再是堆为止在 C++ 中,is_heap_until() 返回一个指向第一个违反堆属性的元素的迭代器。 语法 它具有以下语法: C++ is_heap_until() 示例让我们举一个例子来说明 C++ 中的 is_heap_until() 函数。 示例编译并运行输出 Heap until index: 5 说明 在此示例中,我们使用 is_heap_until() 函数来确定从向量开头有多少个元素保持堆属性。它打印最大堆结构首次被违反的索引。 C++ 堆示例让我们来看一个 C++ 程序来演示 C++ STL 中堆的概念,包括 make_heap()、push_heap()、pop_heap()、sort_heap()、is_heap、is_heap_until()。 示例编译并运行输出 the highest element in a heap created by us is 9915 the highest element in a heap after operating is 9915 the highest element in a heap after performing the pop operation is 6650 说明 在此示例中,我们首先使用 make_heap() 创建一个最大堆,然后使用 push_back() 和 push_heap() 添加一个新元素,最后使用 pop_heap() 和 pop_back() 移除最大元素。 复杂度分析向堆中插入元素 时间复杂度:O(log n)
从堆中删除元素 时间复杂度:O(log n)
结论总之,C++ STL 中的堆提供了一种强大而标准化的方法,通过将标准容器(如 vector)与 <algorithm> 头文件中的实用函数结合使用来管理基于优先级的 数据。这些函数包括 make_heap()、push_heap()、pop_heap() 和 sort_heap(),它们有助于开发人员在不进行手动构建的情况下实现最大堆(或使用自定义比较器实现最小堆)。 C++ 堆选择题1) 在 C++ STL 的上下文中,什么是堆?
答案:b) 满足堆属性的完全二叉树 2) 堆属性在最大堆中确保了什么?
答案:b) 对于树中的所有父节点,它们的值都高于其子节点的值。 3) push_heap() 函数做什么?
答案:c) 在插入后重新排序容器以保持堆属性 4) 在容器上调用 pop_heap() 之前必须满足什么条件?
答案:b) 容器必须是有效的堆 5) 选择堆在 C++ 中的错误用例
答案:b) 在最大堆中以恒定时间查找最小元素的能力 |
在大学里,对大量数据进行分析,并将结果用于组织管理。大学管理部门会及时更新学院列表及其不同的专业,以及负责考试和结果的部门……
阅读 13 分钟
在本文中,您将学习如何在 C++ 中将字符串分割成 N 个相等的部分。字符串操作和基本算术用于 C++ 程序中将字符串分割成 N 个相等的部分。1. 输入:程序开始时需要两个用户输入……
阅读 4 分钟
C++ 类以防止对象复制 C++ 类实例有时根本不应被克隆。防止此类对象复制的三种方法是:不可复制的混合体、私有复制构造函数和赋值运算符,或者删除这些特定成员函数。不合适...
阅读 4 分钟
C++ 中友元函数的优缺点 我们创建了友元函数来访问 C++ 面向对象编程系统中的不同修饰符,如 Protected、Private 和 Public。友元函数或友元类通常在类外部定义,但仍然...
阅读 3 分钟
简介:数学家和计算机科学家一直着迷于对称的序列,它们向前和向后读都相同。有效识别回文子串是计算机科学中的一个常见挑战。Manacher's Algorithm,一种由计算机科学家 Glenn Manacher 开发的开创性技术,提供了一种优雅的解决方案……
5 分钟阅读
大多数时候,您将设计类,以便该类的任意两个实例都是独立的。也就是说,如果我们有两个对象 one 和 two,对 one 的更改不应该以任何方式影响 two。但是,在某些情况下,我们将希望共享数据...
7 分钟阅读
:归并排序是一种流行的排序算法,它使用“分而治之”的原理有效地对元素列表或数组进行排序。归并排序的工作原理概述如下:Divide:如果元素数量为奇数,则将未排序的列表分成两个相等的(或...
阅读 10 分钟
本文旨在介绍 C++ 编程语言的标准模板库,其中我们已经看到了操作函数的用法。由于 C++ STL 浩瀚如海,本文讨论了一些关键函数,如 merge()、operator"="、sort()、unique()、...
阅读 3 分钟
简介:随着 C++11 的发布,C++ 语言经历了许多变化和新增功能。 Lambda 表达式是 C++11 中包含的最重要的功能之一。借助 Lambda 表达式,我们可以创建微小的匿名函数,它们可以用作代码片段或作为……
阅读 3 分钟
在本文中,我们将讨论 C++ 中的 forward_list merge() 函数,包括其语法和示例。forward_list 是一个序列容器,允许在序列中的任何位置进行常数时间插入和删除操作。forward_list 是使用单向链表创建的。顺序是维护的...
阅读 2 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India