- C++
C++ 集合 set 学习笔记
- 2025-5-13 20:13:31 @
C++集合set教程
什么是集合(set)?
在C++里,集合(set)是一种能存储唯一元素的数据结构。它的特别之处在于,所有元素都会根据特定规则自动排序,而且每个元素只能出现一次,这就保证了集合里不会有重复元素。
为什么要使用集合?
集合的用处可多了,比如:
- 能自动对元素进行排序。
- 可以快速查找某个元素,效率很高。
- 保证集合里没有重复元素。
集合的基本操作
下面是集合的一些基本操作示例:
#include <iostream>
#include <set>
using namespace std; // 使用标准命名空间,避免重复写std::
int main() {
// 创建一个存储整数的集合
set<int> mySet;
// 插入元素
mySet.insert(3);
mySet.insert(1);
mySet.insert(2);
mySet.insert(2); // 重复元素,不会被插入
// 输出集合中的元素(自动排序,输出:1 2 3)
cout << "集合中的元素:";
for (int num : mySet) {
cout << num << " ";
}
cout << endl;
// 查找元素
if (mySet.find(2) != mySet.end()) {
cout << "找到元素2" << endl;
} else {
cout << "未找到元素2" << endl;
}
// 删除元素
mySet.erase(2);
// 检查集合是否为空
if (mySet.empty()) {
cout << "集合为空" << endl;
} else {
cout << "集合不为空,大小为:" << mySet.size() << endl;
}
return 0;
}
代码解释
上面代码展示了集合的常见操作:
- 包含头文件:要使用集合,需要包含
<set>
头文件。 - 创建集合:使用
set<int> mySet
来创建一个存储整数的集合。 - 插入元素:通过
insert()
方法往集合里添加元素,集合会自动处理重复元素。 - 遍历集合:可以使用范围for循环来遍历集合中的元素,元素会按照从小到大的顺序排列。
- 查找元素:利用
find()
方法查找元素,如果找到了会返回该元素的迭代器,没找到则返回end()
。 - 删除元素:使用
erase()
方法删除指定元素。 - 检查集合状态:通过
empty()
检查集合是否为空,用size()
获取集合中元素的个数。
进阶操作
除了基本操作,集合还有一些进阶用法:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> mySet = {5, 3, 1, 4, 2};
// 统计元素出现次数(集合中只能是0或1)
cout << "元素3的出现次数:" << mySet.count(3) << endl;
// 查找大于等于4的第一个元素
auto it = mySet.lower_bound(4);
if (it != mySet.end()) {
cout << "大于等于4的第一个元素:" << *it << endl;
}
// 查找大于4的第一个元素
it = mySet.upper_bound(4);
if (it != mySet.end()) {
cout << "大于4的第一个元素:" << *it << endl;
}
// 清空集合
mySet.clear();
cout << "清空后的集合大小:" << mySet.size() << endl;
return 0;
}
进阶操作解释
进阶操作的相关说明如下:
- count()方法:由于集合中元素唯一,该方法返回值只能是0(元素不存在)或1(元素存在)。
- lower_bound()方法:返回一个迭代器,指向大于等于给定值的第一个元素。
- upper_bound()方法:返回一个迭代器,指向大于给定值的第一个元素。
- clear()方法:将集合中的所有元素删除,使集合为空。
集合的注意事项
使用集合时,有几点需要留意:
- 元素唯一性:集合会自动忽略重复元素,所以插入重复元素不会改变集合。
- 自动排序:集合中的元素会按照默认规则(升序)排序,且不能直接修改元素值,若要修改,需先删除该元素,再插入新元素。
- 效率问题:集合的插入、删除和查找操作效率都很高,时间复杂度为O(log n)。
总结
集合(set)是C++标准库中非常实用的一种数据结构,特别适合需要自动排序和去重的场景。通过本教程,你学会了集合的基本和进阶操作,还了解了使用集合的注意事项。希望这些内容能帮助你在编程中更好地运用集合。
2 条评论
-
admin SU @ 2025-5-13 20:15:38
C++ 集合
std::set
教程std::set
是 C++ 标准库中的关联容器之一,它存储一组唯一且有序的元素。默认情况下,std::set
中的元素是按照升序排列的(使用<
运算符比较),但也可以通过自定义比较函数来改变排序规则。📚 一、头文件
要使用
std::set
,需要包含以下头文件:#include <set>
🧱 二、基本特性
- 唯一性:集合中不允许重复元素。
- 有序性:内部使用红黑树实现,默认按升序排列。
- 插入/查找时间复杂度:O(log n)。
- 不支持直接访问元素的位置(因为 set 是基于树结构而非连续内存)。
✅ 三、常用操作
1. 声明和初始化
#include <iostream> #include <set> int main() { std::set<int> s; // 默认升序 set s.insert(5); s.insert(3); s.insert(7); s.insert(3); // 不会插入重复值 for (int x : s) { std::cout << x << " "; // 输出:3 5 7 } }
2. 插入元素:
insert()
s.insert(10);
返回值是一个
pair<iterator, bool>
,表示是否插入成功。3. 删除元素:
erase()
s.erase(5); // 删除值为 5 的元素
或者根据迭代器删除:
auto it = s.find(3); if (it != s.end()) { s.erase(it); }
4. 查找元素:
find()
auto it = s.find(7); if (it != s.end()) { std::cout << "找到元素:" << *it << std::endl; } else { std::cout << "未找到元素" << std::endl; }
5. 判断是否存在:
count()
if (s.count(3)) { std::cout << "3 存在于集合中" << std::endl; }
由于
set
中元素唯一,返回值只能是0
或1
。6. 获取大小和判断是否为空
std::cout << "集合大小:" << s.size() << std::endl; if (s.empty()) { std::cout << "集合为空" << std::endl; }
7. 清空集合
s.clear();
🔁 四、迭代器操作
for (auto it = s.begin(); it != s.end(); ++it) { std::cout << *it << " "; }
或使用反向迭代器:
for (auto it = s.rbegin(); it != s.rend(); ++it) { std::cout << *it << " "; }
🎯 五、自定义排序规则
你可以提供一个比较函数对象来自定义排序方式:
struct cmp { bool operator()(int a, int b) const { return a > b; // 降序排列 } }; std::set<int, cmp> s; s.insert(5); s.insert(3); s.insert(7); for (int x : s) { std::cout << x << " "; // 输出:7 5 3 }
🧩 六、示例代码:综合应用
#include <iostream> #include <set> using namespace std; int main() { set<int> numbers; // 插入数据 numbers.insert({1, 3, 2, 5, 4}); // 遍历输出 cout << "集合内容:"; for (int num : numbers) { cout << num << " "; } cout << endl; // 查找 auto it = numbers.find(3); if (it != numbers.end()) { cout << "找到元素: " << *it << endl; } // 删除 numbers.erase(5); // 检查是否存在 if (!numbers.count(5)) { cout << "5 已被删除" << endl; } // 清空集合 numbers.clear(); return 0; }
📌 七、
std::multiset
简介如果你允许集合中存在重复元素,可以使用
std::multiset
:std::multiset<int> ms; ms.insert(3); ms.insert(3); ms.insert(1); // 结果:1, 3, 3
其他用法与
set
类似。
🧠 八、应用场景
- 去重并排序的数据集
- 快速查找是否存在某元素
- 构建索引结构
- 实现字典、频率统计等
✅ 九、总结
操作 方法 插入 insert()
删除 erase()
查找 find()
是否存在 count()
大小 size()
是否为空 empty()
清空 clear()
自定义排序 提供比较函数
📘 十、相关类型
容器类型 特点 std::set<T>
唯一、有序 std::multiset<T>
可重复、有序 std::unordered_set<T>
唯一、无序(哈希表实现) std::unordered_multiset<T>
可重复、无序 -
2025-5-13 20:14:03@
C++
set
教程(通俗易懂,0基础)一、什么是
set
?在 C++ 中,
set
是一种集合容器,属于 STL(Standard Template Library,标准模板库)的一部分。它用于存储一组唯一的元素(没有重复值),并且这些元素会自动排序。简单来说:
set
中的元素是唯一的,不能重复。set
中的元素默认按升序排列(从小到大)。
二、如何使用
set
?1. 引入头文件
#include <iostream> #include <set> // 使用 set 必须包含这个头文件 using namespace std; // 避免每次都要写 std::
三、定义一个
set
set<int> s; // 定义一个整型的集合
也可以定义其他类型的集合:
set<string> names; // 字符串集合 set<double> scores; // 双精度浮点数集合
四、常用操作
1. 插入元素 ——
insert()
s.insert(5); // 向集合中插入数字 5 s.insert(3); s.insert(5); // 重复插入不会生效,因为 set 不允许重复元素
此时集合中的元素是:
3, 5
2. 删除元素 ——
erase()
s.erase(3); // 删除元素 3
3. 查找元素 ——
find()
if (s.find(5) != s.end()) { cout << "找到了 5" << endl; } else { cout << "没找到 5" << endl; }
find()
返回的是一个迭代器(可以理解为指向元素的指针)- 如果没找到,返回
s.end()
(表示最后一个元素之后的位置)
4. 遍历集合 —— 使用迭代器
for (auto it = s.begin(); it != s.end(); ++it) { cout << *it << " "; // 输出每个元素 } cout << endl;
或者更简单的写法(C++11以上):
for (int x : s) { cout << x << " "; } cout << endl;
5. 判断是否为空 ——
empty()
if (s.empty()) { cout << "集合是空的" << endl; }
6. 获取集合大小 ——
size()
cout << "集合中有 " << s.size() << " 个元素" << endl;
7. 清空集合 ——
clear()
s.clear(); // 清空所有元素
五、完整示例代码
#include <iostream> #include <set> using namespace std; int main() { set<int> s; // 插入元素 s.insert(10); s.insert(5); s.insert(8); s.insert(5); // 重复插入无效 // 遍历输出 cout << "集合中的元素:"; for (int x : s) { cout << x << " "; } cout << endl; // 查找元素 if (s.find(8) != s.end()) { cout << "找到了 8" << endl; } // 删除元素 s.erase(5); // 再次遍历 cout << "删除后集合中的元素:"; for (int x : s) { cout << x << " "; } cout << endl; // 其他操作 cout << "集合大小:" << s.size() << endl; cout << "是否为空:" << (s.empty() ? "是" : "否") << endl; return 0; }
输出结果:
集合中的元素:5 8 10 找到了 8 删除后集合中的元素:8 10 集合大小:2 是否为空:否
六、小结
操作 方法 插入元素 insert()
删除元素 erase()
查找元素 find()
遍历元素 迭代器或范围 for 循环 判断空 empty()
获取大小 size()
清空集合 clear()
七、进阶知识(可选)
1. 降序排列的
set
默认是升序排列,可以通过指定比较函数来改变顺序:
set<int, greater<int>> s; // 从大到小排序
2. 自定义类型放入
set
比如你想把结构体或类对象放到
set
中,需要自己提供比较方式(重载<
运算符或自定义比较函数)。
八、练习题(建议动手试试)
- 创建一个字符串集合,添加几个名字(如 "Tom", "Jerry", "Alice"),然后输出所有内容。
- 输入一个数组,将其中的元素插入到
set
中,输出去重并排序后的结果。 - 编写程序判断用户输入的数字是否已经存在于集合中。
如果你还有任何疑问,欢迎继续提问!😊
- 1