当前位置: 首页 > news >正文

C++中set用法详解

C++ 中std::set用法详解(2025-2026 最新标准视角)

std::set是 C++ STL(标准模板库)中最常用的有序关联容器之一,属于集合(set)的实现。

一、set 的核心特点(必须先记住)

特性说明实际意义
元素唯一自动去重,插入重复元素会被忽略天然适合“集合”概念
自动排序默认按升序排列(使用<比较)插入后无需手动排序
底层实现红黑树(平衡二叉搜索树)插入/删除/查找均为 O(log n)
不可修改元素只能插入/删除,不能直接修改已有元素的值(因为会破坏排序)想改值 → 删除旧的 + 插入新的
有序遍历迭代器天然有序(从 begin() 到 end() 就是升序)适合需要有序输出的场景
不支持随机访问没有[]运算符,只能通过迭代器或 find() 访问不能像 vector 那样用下标

一句话总结:
set = 自动排序 + 自动去重 + 高效查找/插入/删除 的有序集合

二、头文件与基本声明

#include<set>#include<iostream>usingnamespacestd;

最常用声明方式:

set<int>s;// 默认升序set<int,greater<int>>s2;// 降序set<string>names;// 存储字符串(按字典序)

三、常用成员函数一览(高频使用)

函数功能时间复杂度示例用法返回值说明
insert(x)插入元素 xO(log n)s.insert(5);pair<iterator, bool>(插入成功返回 true)
erase(x) / erase(it)删除元素 x 或迭代器位置的元素O(log n)s.erase(5); s.erase(s.find(3));删除的元素个数(通常 0 或 1)
find(x)查找元素 xO(log n)auto it = s.find(10);找到返回迭代器,没找到返回 end()
count(x)元素 x 出现的次数(只有 0 或 1)O(log n)if (s.count(7)) cout << “存在”;0 或 1
size() / empty()大小 / 是否为空O(1)if (s.empty()) …
clear()清空所有元素O(n)s.clear();
begin() / end()指向第一个 / 最后一个后一个元素O(1)for(auto it = s.begin(); it != s.end(); ++it)有序迭代器
lower_bound(x)第一个 ≥ x 的元素O(log n)auto it = s.lower_bound(10);≥ x 的第一个位置
upper_bound(x)第一个 > x 的元素O(log n)auto it = s.upper_bound(10);> x 的第一个位置
equal_range(x)[lower_bound(x), upper_bound(x))O(log n)auto [l, r] = s.equal_range(5);等于 x 的范围(set 中最多一个)

四、代码实战示例(最常用场景)

1. 基本插入 + 遍历
set<int>s;s.insert(30);s.insert(10);s.insert(50);s.insert(20);s.insert(10);// 重复元素,自动忽略// 遍历(天然有序)for(intx:s){cout<<x<<" ";// 输出:10 20 30 50}cout<<endl;
2. 查找与删除
if(s.find(20)!=s.end()){cout<<"找到 20\n";s.erase(20);// 删除 20}if(s.count(100)==0){cout<<"100 不存在\n";}
3. lower_bound / upper_bound 经典用法(区间查询)
// 找出 [20, 40] 之间的所有元素autol=s.lower_bound(20);autor=s.upper_bound(40);for(autoit=l;it!=r;++it){cout<<*it<<" ";// 输出 20 30}
4. 自定义比较器(降序 / 自定义结构体)
// 降序 setset<int,greater<int>>desc;desc.insert({5,1,8,3});// 输出顺序:8 5 3 1// 自定义结构体按某个字段排序structStudent{string name;intscore;};autocmp=[](constStudent&a,constStudent&b){returna.score>b.score;// 按分数降序};set<Student,decltype(cmp)>students(cmp);
5. pair / 多关键字排序(非常常见)
set<pair<int,string>>s;// 默认先按 int 升序,再按 string 升序s.insert({90,"Alice"});s.insert({85,"Bob"});s.insert({90,"Charlie"});// 90 的 Alice 在 Charlie 前面(string 字典序)

五、set vs unordered_set vs multiset

容器是否有序是否允许重复查找/插入复杂度适用场景
setO(log n)需要有序 + 去重
unordered_set平均 O(1)只需快速去重 + 不关心顺序
multisetO(log n)需要有序 + 允许重复元素

六、2026 年使用建议(面试 + 生产)

  1. 需要有序输出范围查询→ 首选 set
  2. 只关心去重不关心顺序→ 用 unordered_set(更快)
  3. 需要有序 + 允许重复→ 用 multiset
  4. 元素是自定义类型 → 必须提供<运算符 或 自定义比较器
  5. 频繁增删 + 元素量大(>10^6) → 优先考虑 unordered_set(但注意哈希冲突最坏 O(n))
  6. 面试高频题:用 set 实现滑动窗口中位数、最近请求次数等

七、最简总结(背下来就够面试)

  • set:有序、唯一、红黑树、O(log n) 操作
  • 插入重复元素自动忽略
  • 不可通过迭代器修改元素值(const)
  • lower_bound / upper_bound 是最强范围查询利器

如果你现在有具体的使用场景(比如怎么用 set 去重排序、怎么实现有序去重输出、自定义比较器报错等),可以贴代码或描述需求,我帮你写最优解法。

http://www.jsqmd.com/news/428885/

相关文章:

  • 2026靠谱的专利管理系统厂家推荐及行业选择指南 - 品牌排行榜
  • 视力1.0等于没近视?别被这个“满分”骗了!
  • 如何防控孩子近视?看完你就明白了
  • 2026知识产权管理系统服务公司推荐 - 品牌排行榜
  • 2026年3月云南AIGEO推广/AIgeo优化/AI搜索推广公司推荐:AI 流量变革期,选对伙伴决胜未来 - 2026年企业推荐榜
  • 月之暗面Kimi K2.5简要介绍
  • 在线证件照工具会翻车吗?实测这款工具效果最接近照相馆 - 博客湾
  • gitlab
  • 2026靠谱的专利管理系统公司推荐与选择指南 - 品牌排行榜
  • 2026年靠谱的专利管理系统厂家推荐与选择指南 - 品牌排行榜
  • Python面试算法题
  • 2026年度权威榜单最佳扩散炉品牌推荐,你选对了吗? - 睿易优选
  • 2026年废铜回收厂家推荐:广州东恰再生资源有限公司,专业废铜/废旧废铜/二手废铜上门回收服务 - 品牌推荐官
  • 从体系建立到拿证:盘点2026年口碑好的AS9100航空航天认证第三方辅导代办机构公司 - 速递信息
  • 2026专利管理系统厂家排行榜:技术与服务双优之选 - 品牌排行榜
  • 2026年3月云南Geo优化/geo推广/AI搜索优化推广/公司深度分析报告:格局重塑与选型指南 - 2026年企业推荐榜
  • sql面试记录题
  • Vue3 实战一个小项目(如 Todo List 或 天气查询),强制使用 Composition API
  • 2026靠谱的商标管理系统公司推荐及选择指南 - 品牌排行榜
  • 2026哪些公司提供优质商标管理系统?行业实践案例参考 - 品牌排行榜
  • 2026商标管理系统开发公司推荐及选择参考 - 品牌排行榜
  • 2026年英联翻译公司(INLION Translation)官方联系方式公示,精准翻译合作便捷入口 - 讯息观点
  • 基于PLC的机械手控制系统设计
  • 如何在 DotNet 中使用类似 golang 的 vendor 的编译模式
  • 鸿蒙 HarmonyOS 6 | 多媒体 (02) 音视频 AVPlayer 播放器定制与音频并发策略
  • 2026年 发电机厂家推荐排行榜,柴油发电机/玉柴/康明斯/潍柴/通柴/上柴/高压/大功率发电机,实力品牌与高效动力深度解析 - 品牌企业推荐师(官方)
  • 基于PLC的机械臂控制系统设计
  • 安立MS2760A超便携频谱仪测试汽车毫米波雷达
  • 实测才敢推!MBA专属AI论文网站 —— 千笔·专业学术智能体
  • [AI智能体与提效-117] - OpenAI API用法:response = client.chat.completions.create的返回结果为啥是response,而不是会话的对象?