在 C++ 中初始化集合的方法

2025年2月10日 | 阅读 8 分钟

在 C++ 中,'std::set' 是一个存储元素的容器。当你创建一个 set 时,实际上就是向其中添加元素。C++ 提供了多种初始化 set 的方法,允许你从其他来源或以不同的方式填充它。

正确地初始化一个 set 很重要,因为它能确保 set 保持其排序的特性。在初始化过程中,重复元素会被自动处理。元素会根据其值(如果指定了自定义比较函数,则根据自定义比较函数)按升序排列。

在 C++ 中,有以下几种初始化 set 的方法:

  1. 默认初始化: 使用默认构造函数创建一个 set。
  2. 带元素的初始化: set 从预定义的一系列元素开始,可以使用初始化列表,或者从数组或 vector 等容器中复制元素。
  3. 复制初始化: 使用复制构造函数或赋值运算符,通过复制现有 set 的元素来构建一个新 set。
  4. 范围初始化: 使用迭代器指定的元素范围来初始化 set,这些迭代器可以来自容器或数据结构。
  5. 更新 set 的方法是使用添加一个或多个元素的函数: 另一种技巧是,在 C++11 及更高版本中,可以通过移动(move)一个 C++ 集合中的项来开始构建一个集合,以避免重复。你还可以使用比较器函数或仿函数来初始化一个集合,以定义排序规则。

这些初始化方法都有其特定的语法、优点和适用场景。有些方法更适合从零开始初始化一个 set,而另一些方法则更适合向现有 set 添加元素或从其他容器复制元素。

在接下来的章节中,我们将详细探讨每种初始化方法,并提供示例和解释,以帮助你根据具体需求有效地初始化 C++ 中的 set。

1. 默认初始化

在 C++ 中,你可以通过使用默认构造函数来创建 set。

语法

示例

输出

The set is empty.

说明

  • 在此示例中,`my_set` 是一个使用默认构造函数创建的整数 set。
  • 无论 set 是否为空,你都可以使用“)”函数。(这里似乎漏了一个词,可能是“insert”或其他相关函数)
  • 默认初始化在你希望先创建一个 set,然后再向其中插入元素时非常方便。

2. 使用初始化列表进行初始化

为了创建一个 set,你可以将想要的元素放在花括号 {} 中列出,这称为初始化列表。

语法

请记住,此列表中的元素应该是唯一的,并根据 set 的比较方式进行排序(对于数据类型,通常是升序)。

初始化 set 时,任何重复的项都会被自动删除。

示例

输出

1 2 3 5 8

说明

在给定的实例中,名为 `my_set` 的 set 以包含重复值的列表开始(数字 '8' 出现不止一次)。创建 set 时,它会自动删除这些重复项,并将唯一的元素按升序排列。使用初始化列表可以轻松地设置一个预定义元素的 set。

3. 从另一个容器(例如数组、vector)复制元素进行初始化

C++ 中的 set 可以通过从数组或 vector 等其他容器复制元素来初始化。这是通过使用 set 类的范围构造函数或范围插入方法实现的。

从数组初始化

语法

`begin_iter` 和 `end_iter` 是指向数组开始和结束的迭代器。

示例

输出

1 2 3 5 8

说明

  • 在上面的示例中,`my_set` 这个 set 是通过从数组 `arr` 复制元素来初始化的。
  • 范围构造函数接受两个迭代器,`arr`(数组的开始)和 `arr + arr_size`(数组的结束),来指定要复制的元素范围。
  • 在初始化过程中,set 会自动删除重复项,并将剩余的元素按升序排序。

从 vector 初始化

在 C++ 中,你可以使用 vector 来创建一个名为 `set_name` 的 set。

语法

`vector.begin()` 和 `vector.end()` 是指向 vector 开始和结束的迭代器。

示例

输出

1 2 3 5 8

说明

在给定的实例中,名为 `my_set` 的 set 是通过复制名为 `vec` 的 vector 中的元素来初始化的。范围构造函数需要两个迭代器,`vec.begin()`(表示 vector 的开始)和 `vec.end()`(表示 vector 的结束),来定义哪些元素将被复制。

当初始化 set 时,它会自动删除任何重复项,并将其余项按升序排列。

当你的数组、vector 或其他容器中存储了大量数据,并且想要创建一个包含该集合中唯一元素的 set 时,通过从另一个容器传输元素来设置 set 会非常方便。

4. 使用复制构造函数从另一个 Set 初始化

在 C++ 中,你可以通过复制构造函数来复制另一个 set 的元素来创建 set。此构造函数会生成一个包含从原 set 复制的元素的 set。

语法

示例

输出

1 2 3 5 8

说明

在此示例中,`original_set` 这个 set 包含已有的整数。使用复制构造函数,我们创建了一个名为 `new_set` 的 set,它镜像了 `original_set` 的内容,保持了其顺序和唯一性。当一个 set 使用复制构造函数从另一个 set 初始化时,它会生成该 set 的副本,允许对一个 set 进行修改而不会影响另一个 set。

5. 使用范围构造函数从另一个可迭代数据结构初始化

在 C++ 中,你可以使用范围构造函数,通过从数组、vector 或其他容器等数据结构传输项来初始化 set。此构造函数需要两个迭代器:一个指向范围的开始,另一个指向范围的结束。

语法

示例

输出

1 2 3 5 8

6. 插入单个元素

在设置好 set 后,你可以选择使用 `insert()` 函数添加元素。此函数会将元素添加到 set 中,除非它已存在。

语法

如果元素已经属于 set,执行 `insert()` 函数不会对其进行更改;相反,迭代器将指向该现有元素。

示例

输出

1 3 5 7

说明

在提供的示例中,我们首先使用元素 {1, 3, 5} 设置 `my_set`。然后,我们使用命令 `my_set.insert(7)` 将数字 7 添加到 set 中。之后,我们尝试通过 `auto iter = my_set.insert(3);` 添加 3。由于 3 已经存在于 set 中,`insert()` 操作不会改变任何内容。它会返回一个指向现有元素 3 的迭代器。`)` 操作的结果是一个 `std::pair`,它包含一个指向已插入元素(如果插入失败则指向现有元素)的迭代器,以及一个布尔值,指示插入是否成功。现在我们可以显示 set 中的元素,包括 {1, 3, 5, 7}。向 set 添加元素在你需要将项添加到已建立的 set 中时非常方便,同时确保每个项都是唯一的并保持排序。

7. 使用初始化列表进行插入

  • 除了插入单个元素,你还可以使用初始化列表和 `insert()` 成员函数一次性将多个元素插入到现有 set 中。
  • `insert()` 函数可以接受一个初始化列表作为参数,允许你在一次调用中插入多个元素。

语法

初始化列表中的重复元素在插入时会被自动丢弃。

示例

输出

1 3 5 7 9 11

说明

  • 在上面的示例中,我们首先用元素 {1, 3, 5} 初始化 `my_set`。
  • 然后,我们使用初始化列表和 `insert()` 函数将多个元素 {7, 9, 3, 11} 插入到 set 中:`my_set.insert({7, 9, 3, 11});`。
  • 在插入过程中,重复元素 '3' 会被自动丢弃,因为它已经存在于 set 中。
  • 剩余的元素 '7'、'9' 和 '11' 会被插入到 set 中,并保持其排序。
  • 最后,我们输出 set 的元素,现在它包含 {1, 3, 5, 7, 9, 11}。

使用初始化列表插入多个元素非常方便,当你希望在一次操作中将一组预定义元素添加到现有 set 中,同时保持 set 的唯一性和排序特性时。