C 中std::set用法详解2025-2026 最新标准视角std::set是 C STL标准模板库中最常用的有序关联容器之一属于集合set的实现。一、set 的核心特点必须先记住特性说明实际意义元素唯一自动去重插入重复元素会被忽略天然适合“集合”概念自动排序默认按升序排列使用比较插入后无需手动排序底层实现红黑树平衡二叉搜索树插入/删除/查找均为 O(log n)不可修改元素只能插入/删除不能直接修改已有元素的值因为会破坏排序想改值 → 删除旧的 插入新的有序遍历迭代器天然有序从 begin() 到 end() 就是升序适合需要有序输出的场景不支持随机访问没有[]运算符只能通过迭代器或 find() 访问不能像 vector 那样用下标一句话总结set 自动排序 自动去重 高效查找/插入/删除 的有序集合二、头文件与基本声明#includeset#includeiostreamusingnamespacestd;最常用声明方式setints;// 默认升序setint,greaterints2;// 降序setstringnames;// 存储字符串按字典序三、常用成员函数一览高频使用函数功能时间复杂度示例用法返回值说明insert(x)插入元素 xO(log n)s.insert(5);pairiterator, bool插入成功返回 trueerase(x) / erase(it)删除元素 x 或迭代器位置的元素O(log n)s.erase(5); s.erase(s.find(3));删除的元素个数通常 0 或 1find(x)查找元素 xO(log n)auto it s.find(10);找到返回迭代器没找到返回 end()count(x)元素 x 出现的次数只有 0 或 1O(log n)if (s.count(7)) cout “存在”;0 或 1size() / 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. 基本插入 遍历setints;s.insert(30);s.insert(10);s.insert(50);s.insert(20);s.insert(10);// 重复元素自动忽略// 遍历天然有序for(intx:s){coutx ;// 输出10 20 30 50}coutendl;2. 查找与删除if(s.find(20)!s.end()){cout找到 20\n;s.erase(20);// 删除 20}if(s.count(100)0){cout100 不存在\n;}3. lower_bound / upper_bound 经典用法区间查询// 找出 [20, 40] 之间的所有元素autols.lower_bound(20);autors.upper_bound(40);for(autoitl;it!r;it){cout*it ;// 输出 20 30}4. 自定义比较器降序 / 自定义结构体// 降序 setsetint,greaterintdesc;desc.insert({5,1,8,3});// 输出顺序8 5 3 1// 自定义结构体按某个字段排序structStudent{string name;intscore;};autocmp[](constStudenta,constStudentb){returna.scoreb.score;// 按分数降序};setStudent,decltype(cmp)students(cmp);5. pair / 多关键字排序非常常见setpairint,strings;// 默认先按 int 升序再按 string 升序s.insert({90,Alice});s.insert({85,Bob});s.insert({90,Charlie});// 90 的 Alice 在 Charlie 前面string 字典序五、set vs unordered_set vs multiset容器是否有序是否允许重复查找/插入复杂度适用场景set是否O(log n)需要有序 去重unordered_set否否平均 O(1)只需快速去重 不关心顺序multiset是是O(log n)需要有序 允许重复元素六、2026 年使用建议面试 生产需要有序输出或范围查询→ 首选 set只关心去重且不关心顺序→ 用 unordered_set更快需要有序 允许重复→ 用 multiset元素是自定义类型 → 必须提供运算符 或 自定义比较器频繁增删 元素量大10^6 → 优先考虑 unordered_set但注意哈希冲突最坏 O(n)面试高频题用 set 实现滑动窗口中位数、最近请求次数等七、最简总结背下来就够面试set有序、唯一、红黑树、O(log n) 操作插入重复元素自动忽略不可通过迭代器修改元素值constlower_bound / upper_bound 是最强范围查询利器如果你现在有具体的使用场景比如怎么用 set 去重排序、怎么实现有序去重输出、自定义比较器报错等可以贴代码或描述需求我帮你写最优解法。