1. Set 容器概述:为什么需要 Set?
在 C++ 编程中,我们经常需要处理一组数据,这些数据可能要求唯一性(不重复)和有序性。比如统计一篇文章中的不同单词、维护一个学生成绩排行榜或者实现一个高效的黑名单检查系统。在这些场景下,set容器就显示出其独特的价值。
Set 是 C++ 标准模板库(STL)中的关联容器,它基于红黑树(一种自平衡二叉查找树)实现,能够自动维护元素的唯一性和有序性 。当你向 set 中插入元素时,它会自动按照特定规则排序,并确保每个元素只出现一次,这大大简化了我们的编程工作。
与数组和 vector 等序列容器不同,set 不关心元素的插入顺序,只关注元素的最终排序状态和唯一性。这种特性使得它在特定应用场景下具有极高的效率优势。
2. Set 的核心特性与底层原理
2.1 三大核心特性
Set 容器具有以下三个显著特性:
- 元素唯一性:Set 中的元素都是唯一的,重复插入相同的元素会被自动忽略 。
#include <set>
#include <iostream>
int main() {
std::set<int> mySet;
mySet.insert(5);
mySet.insert(5);// 重复插入,会被忽略
std::cout << "Set大小: " << mySet.size() << std::endl;// 输出: 1
return 0;
}
- 自动排序:Set 中的元素默认按升序排列,也支持自定义排序规则 。
std::set<int> numSet = {
3, 1, 4, 1, 5, 9};
for (int num : numSet) {
std::cout << num << " ";// 输出: 1 3 4 5 9
}
- 高效操作:基于红黑树实现,查找、插入和删除操作的时间复杂度均为 O(log n) 。
2.2 底层实现:红黑树原理
Set 的底层实现是红黑树,这是一种自平衡的二叉查找树。红黑树通过以下规则保持平衡:
- 每个节点要么是红色,要么是黑色
- 根节点是黑色
- 红色节点的子节点必须是黑色
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
这些约束确保了红黑树的最长路径不会超过最短路径的两倍,从而保证了基本操作(插入、删除、查找)的时间复杂度为 O(log n) 。
3. Set 与 Unordered_set 的对比选择
在实际开发中,我们还需要了解 unordered_set,它基于哈希表实现,与 set 有显著区别:
| 特性 | set |
unordered_set |
|---|---|---|
| 底层结构 | 红黑树 | 哈希表 |
| 时间复杂度 | O(log n) | O(1) 平均,O(n) 最坏 |
| 有序性 | 自动排序 | 无序 |
| 内存占用 | 较低 | 较高(哈希表开销) |
| 适用场景 | 需要有序访问 | 只需快速查找 |
选择指南:
- 需要元素有序或进行范围查询时选择
set - 只需快速查找且不关心顺序时选择
unordered_set
4. Set 的基本操作详解
4.1 创建和初始化
Set 提供了多种创建方式:
#include <set>
#include <vector>// 1. 默认构造
std::set<int> set1;
// 2. 初始化列表构造
std::set<int> set2 = {
3, 1, 4, 1, 5};// 实际包含:1, 3, 4, 5
// 3. 迭代器范围构造
std::vector<int> vec = {
2, 4, 6, 8};
std::set<int> set3(vec.begin(), vec.end());
// 4. 拷贝构造
std::set<int> set4(set2);
4.2 插入元素
Set 提供了多种插入方法:
std::set<std::string> mySet;
// 1. 直接插入
mySet.insert("apple");
// 2. 带位置提示的插入(优化性能)
auto hint = mySet.end();
mySet.insert(hint, "banana");
// 3. 批量插入
mySet.insert({
"cherry", "date", "elderberry"});
// 检查插入结果
auto result = mySet.insert("apple");
if (!result.second) {
std::cout << "插入失败,元素已存在" << std::endl;
}
4.3 查找元素
Set 提供了高效的查找方法:
std::set<int> numSet = {
10, 20, 30, 40, 50};
// 1. 使用 find() 查找
auto it = numSet.

最低0.47元/天 解锁文章
1394

被折叠的 条评论
为什么被折叠?



