集合(Set)的核心概念
1. 基本特性
- 唯一性:集合中的元素不允许重复,自动去重
- 无序性:元素存储顺序与插入顺序无关
- 快速查找:支持高效的插入、删除和查找操作
2. C++ 中的实现
类型 | 底层结构 | 时间复杂度 | 有序性 |
---|---|---|---|
std::set | 红黑树 | O(log n) | 有序 |
std::unordered_set | 哈希表 | O (1)(平均) | 无序 |
推荐使用场景:
- 需要快速查找和去重 →
unordered_set
- 需要保持有序性 →
set
常见操作示例
构造和赋值
set< T > st //默认构造函数
set(const set &st) //拷贝构造函数
set& operator=(const set &st) //重载等号操作符
插入与删除元素
unordered_set<int> s;
s.insert(5); // 插入5
s.insert(5); // 重复插入无效
注意:set容器没有push_back, pop_back这两种插入接口,只能用insert函数进行插入。如果向set容器中插入相同元素,不会报错,但是打印的时候会自动滤去多余的元素,一个元素只能有一个,而且打印结果是排好序了的。
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(elem);//删除容器中值为elem的元素
查找与统计元素
if (s.find(5) != s.end()) {//查找5是否存在,若存在返回该键的元素的迭代器;若不存在,返回set.end()
cout << "5 exists";
}
count(key);//统计key的元素个数
遍历元素
for (int x : s) {
cout << x << " ";
}
计算大小与交换
int size = s.size();//返回容器中元素的数目
s1.empty();//判断容器是否为空
swap(st);//交换两个集合容器
复杂度对比
操作 | unordered_set | set |
---|---|---|
插入 | O(1) | O(log n) |
删除 | O(1) | O(log n) |
查找 | O(1) | O(log n) |
遍历 | O(n) | O(n) |
最佳实践建议
- 当需要快速去重时优先使用
unordered_set
- 对内存敏感时注意哈希表的负载因子(默认 0.75)
- 处理大量数据时考虑预分配空间
- 避免频繁的元素删除操作
通过合理使用集合,可以显著简化代码逻辑并提升运行效率,特别适合需要快速去重和统计的场景。