一文搞懂集合 Set:从基础到实战的 C++ 数据结构解析

集合(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_setset
插入O(1)O(log n)
删除O(1)O(log n)
查找O(1)O(log n)
遍历O(n)O(n)

最佳实践建议

  1. 当需要快速去重时优先使用unordered_set
  2. 对内存敏感时注意哈希表的负载因子(默认 0.75)
  3. 处理大量数据时考虑预分配空间
  4. 避免频繁的元素删除操作

通过合理使用集合,可以显著简化代码逻辑并提升运行效率,特别适合需要快速去重和统计的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值