C++ 集合

C++ 集合

集合 (Set) 以排序方式存储多个元素,其中每个元素都是唯一的。

集合中的元素:

  • 会自动按升序排序
  • 具有唯一性,相等的或重复的值会被忽略
  • 可以添加和移除,但不能修改已存在元素的值
  • 不能通过索引号访问,因为顺序是基于排序而非索引

要使用集合,需要包含 <set> 头文件:

// 包含集合库
#include <set>

创建集合

使用 set 关键字创建集合,在尖括号 <> 中指定存储值的类型,然后指定集合名称,格式为:

set<type> setName

实例

// 创建一个名为cars的集合,用于存储字符串
set<string> cars;

如果要在声明时添加元素,可以将元素放在花括号 {} 内的逗号分隔列表中:

实例

// 创建一个名为 cars 的集合,用于存储字符串
set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 打印集合元素
for (string car : cars) {
  cout << car << "\n";
}

亲自试一试

输出:

BMW
Ford
Tesla
Volvo

从上面的结果可以看出,集合中的元素会自动排序。在这个例子中,因为是字符串,所以按字母顺序排序。

如果集合中存储的是整数,则会按数值大小排序:

实例

// 创建一个名为 numbers 的集合,用于存储整数
set<int> numbers = {1, 7, 3, 2, 5, 9};

// 打印集合元素
for (int num : numbers) {
  cout << num << "\n";
}

亲自试一试

输出:

1
2
3
5
7
9

注意:集合的类型(如上面两个例子中的 stringint)在声明后不能更改。

按降序排序集合

默认情况下,集合中的元素按升序排序。如果要反转排序顺序,可以在尖括号中使用 greater<type> 函数对象:

实例

// 按降序排序集合元素
set<int, greater<int>> numbers = {1, 7, 3, 2, 5, 9};
// 打印元素
for (int num : numbers) {
  cout << num << "\n";
}

亲自试一试

输出:

9
7
5
3
2
1

注意:greater<type> 中指定的类型必须与集合元素的类型匹配(本例中为 int)。

唯一元素

集合中的元素是唯一的,这意味着它们不能重复或相等。

例如,如果我们尝试在集合中添加两次 "BMW",重复的元素会被忽略:

实例

set<string> cars = {"Volvo", "BMW", "Ford", "BMW", "Tesla"};

// 打印集合元素
for (string car : cars) {
  cout << car << "\n";
}

亲自试一试

输出:

BMW
Ford
Tesla
Volvo

添加元素

要向集合添加元素,可以使用 .insert() 函数:

实例

set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 添加新元素
cars.insert("BYD");
cars.insert("VW");
cars.insert("Toyota");
cars.insert("Audi");

亲自试一试

移除元素

要从集合中移除特定元素,可以使用 .erase() 函数:

实例

set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 移除元素
cars.erase("Volvo");
cars.erase("Tesla");

亲自试一试

要移除集合中的所有元素,可以使用 .clear() 函数:

实例

set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 移除所有元素
cars.clear();

亲自试一试

获取集合大小

要获取集合中元素的数量,可以使用 .size() 函数:

实例

set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cout << cars.size();  // 输出 4

亲自试一试

检查集合是否为空

使用 .empty() 函数检查集合是否为空。

如果集合为空,.empty() 函数返回 1(true),否则返回 0(false):

实例

set<string> cars;
cout << cars.empty();  // 输出 1(集合为空)

亲自试一试

实例

set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cout << cars.empty();  // 输出 0(不为空)

亲自试一试

遍历集合

可以使用 for-each 循环遍历集合:

实例

set<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

for (string car : cars) {
  cout << car << "\n";
}

亲自试一试

提示:也可以使用迭代器遍历集合,这将在后续章节中详细介绍。