C++ 无序集合2024 年 8 月 28 日 | 阅读 6 分钟 概述 在 C++ 中,无序集合(unordered_set)是一个容器数据结构,用于存储不考虑顺序的元素。本文涵盖了广泛的主题,包括什么是无序集合,如何在 C++ 中创建和初始化它,以及它与 C++ 中集合(set)的区别。为了充分理解 C++ 中无序集合的工作原理及其使用方法,我们还将探讨各种示例和示例代码。 C++ 中的无序集合是什么意思?引言 在 C++ 中,无序集合类似于一个容器数据结构。这意味着我们可以在其中存储各种元素。无序集合的独特之处在于它只包含单个元素。如果您在 C++ 的无序集合中添加重复元素,它只会保留该元素的单个实例。此容器还有一个独特的功能,可以按任意顺序存储元素。因此,无序集合与 C++ 的集合(set)不同,后者按升序存储元素。 让我们通过一个示例来尝试理解无序集合在 C++ 中如何存储元素。如果我们向 C++ 的无序集合中添加条目 1、4、9、2、1 和 10,则该无序集合将显示如下: 如您所见,元素1 的重复项已被消除,并且元素排列没有特定顺序。 当您需要快速准确地确定某个元素是否至少出现一次、计算不同元素的数量,或者两者都需要时,无序集合非常有用。在接下来的部分中,我们将更详细地介绍 C++ 无序集合的复杂性。 如何创建无序集合?现在我们知道了 C++ 中无序集合的用途,让我们看看如何创建它。 首先,<unordered_set>头文件包含了使我们能够在 C++ 中使用无序集合的头文件库。要使用 C++ 中的无序集合,我们必须在其函数开头包含它。 语法 在 C++ 中,以下语法用于声明一个空的无序集合: 在此,数据类型代表将添加到无序集合中的元素的类型。 如何初始化无序集合?我们已经介绍了在 C++ 中创建空无序集合的方法。但是,如果您想创建一个已经包含一些元素的无序集合,您必须首先包含 <unordered_set>头文件。在 C++ 中初始化无序集合使用以下语法: 这两种方法都会产生相同的结果。e1、e2、e3、e4...是要在创建时插入无序集合的元素,而数据类型表示将要插入无序集合的元素的类型。 让我们看一些 C++ 无序集合功能的代码。 C++ 中无序集合的内部实现方式是什么?我们已经演示了 C++ 无序集合的创建和初始化,那么元素在这些容器内部是如何存储的呢?无序集合在 C++ 中是通过哈希表实现的。因此,我们添加到无序集合中的每个元素都会经过哈希运算,生成一个哈希键,然后保存在哈希表中。C++ 中的无序集合之所以能随机且不按特定顺序存储元素,是因为哈希键由函数决定,并且是通过随机方法生成的。 这也是为什么哈希函数的底层复杂度会影响无序集合复杂度的另一个原因。C++ 中无序集合的所有操作通常需要 O(1) 的常数时间,但在最坏的情况下,它们可能需要 O(n) 的时间,这种情况极其罕见。 集合(Set)与无序集合(Unordered Set)集合(set)是 C++ 中的另一个容器元素,与无序集合几乎相同。无序集合与集合的区别在于,它随机存储其唯一元素且不按特定顺序排列,而集合则按其值的升序排列。 由于无序集合在 C++ 中是通过哈希表实现的(我们之前已经讲过),元素是随机排序存储的。另一方面,C++ 的集合(set)实现了一个平衡树,使其能够按排序顺序存储元素。 这种实现方式上的差异会影响这两种容器的时间复杂度和各种操作。虽然 C++ 中的集合(set)的平均时间复杂度为 O(log(n)),但无序集合的所有操作的平均时间复杂度为 O(1)。但是,n 是存储在其中的元素数量,两者的空间复杂度均为 O(n)。 C++ 中的无序集合方法让我们来看看 C++ 中可以与无序集合一起使用的各种方法,以及它们的语法和计算要求。
如何在 C++ 中遍历无序集合的元素在 C++ 中,我们可以使用索引来遍历数组,但在无序集合中没有索引的概念。另一方面,迭代器是指向无序集合中各个元素的指针。我们可以使用这些迭代器来遍历无序集合及其所有元素。 正如在前一部分中所演示的,begin() 方法返回一个指向无序集合开头的迭代器,我们的循环可以在那里开始。我们循环的终止条件将是 end() 方法返回的指向无序集合最后一个元素之后的那个迭代器。 输出 21 8 7 31 15 81 11 在上面的代码中,在将迭代器初始化为无序集合的开头后,我们一直遍历到结束迭代器。在 C++ 中,我们可以通过以下方式遍历无序集合的元素。 结论在 C++ 中,无序集合(unordered_set)是一个容器数据结构,用于存储不考虑顺序的唯一元素。<unordered_set>头文件包含了使我们能够在 C++ 中使用无序集合的头文件库。 无序集合在 C++ 中是通过哈希表实现的。C++ 中无序集合的所有操作通常需要 O(1) 的常数时间,但有时可能需要 O(n) 的时间。 C++ 中的集合(set)与无序集合(unordered_set)的区别在于,集合使用平衡树结构来实现,并按升序存储唯一元素。 在 C++ 中,可以使用各种函数访问无序集合,包括 insert()、begin()、end()、size()、empty()、clear()、erase()、count() 和 find()。 |
在 C++ 中,在数据类型之间进行转换通常是必需的。将双精度浮点数转换为字符串表示形式是一种常见场景。它允许将双精度值显示给用户或打印出来进行调试。双精度是 C++ 中的一种数据类型...
5 分钟阅读
文件处理操作是 C++ 编程中非常重要的一部分。在大多数程序中,我们需要从文件读取或写入文件。在 C++ 中,我们可以使用文件处理库来执行文件操作。该库提供了几个允许我们...
阅读 3 分钟
在 C 或 C++ 等编程语言中,我们声明任何变量,并在编译时显式声明变量的数据类型。但类型推断意味着我们使用一些关键字,通过这些关键字我们无需声明变量的数据类型...
阅读 4 分钟
用 C++ 进行编程就像踏上一场宏大的探险。在这段旅程中,你会遇到复杂的概念和令人兴奋的挑战。这篇文章中最重要的里程碑之一是掌握指针。在 C++ 中,指针就像你值得信赖的指南针,指引你穿过 intricacies...
7 分钟阅读
fegetexceptflag 函数是 C 标准库的一部分,明确指定在 <fenv.h> 头文件中。它用于处理 C 程序中的浮点异常。浮点异常发生在某些算术运算(如溢出或无效运算)导致异常情况时。语法...
阅读 4 分钟
作用域解析指针和“the”this 指针对于在软件开发敏捷生命周期方法论中实现有效的 C++ 程序和设计面向对象的过程至关重要。作用域解析运算符可帮助开发人员访问类成员或静态实体。关于...
阅读 3 分钟
在不断发展的金融和投资领域,算法问题求解起着至关重要的作用。在交易员和投资者遇到的挑战中,股票跨度问题(Stock Span Problem)脱颖而出,它要求根据给定的一系列股票价格来计算股票跨度。这篇博文旨在...
阅读 4 分钟
当我们处理可能只有一个数据类型作为返回类型的函数时,我们可能需要返回多种数据类型。为了解决这个问题,我们正在学习返回各种值的概念……
阅读 4 分钟
快速排序是流行的排序技术之一,以其时间和效率而闻名。历史:快速排序算法由 Tony Hoare 在 1959 年开发,当时他正在攻读计算机科学硕士学位。它是最有效和广泛使用的排序...
14 分钟阅读
:在斐波那契数列的情况下,数字是前两个数字的总和,例如 0、1、1、2、3、5、8、13、21 等。斐波那契数列的前两个数字是 0 和 1。有两种方法可以编写斐波那契...
阅读 2 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India