hololive滚滚山免安装绿色中文版
995M · 2025-10-31
set在 C++ 里,你可能经常要判断一个元素是否存在,或者需要一个“不重复”的集合。
这时候,std::set 就能起到这个作用。
很多人一开始会把它当成一个“去重的容器”,但 set 的设计比这复杂得多。今天我们就从原理、用法、性能和场景四个角度把它讲清楚。
set 是啥?std::set 是 C++ STL 中的关联容器,存储一组 唯一的元素,并且自动排序。
它有几个核心特点:
< 运算符或自定义比较器排序。你可以把它看作是一个性能较为稳定的“有序、不重复的数组”。
和 map 类似,set 的底层通常是 红黑树(一种平衡二叉搜索树)。
这就解释了:
set 插入后自动有序(因为树的性质)。如果想要“无序集合”,C++ 还提供了 unordered_set(哈希表实现)。
举个例子:
#include <iostream>
#include <set>
using namespace std;
int main() {
    set<int> s;
    s.insert(3);
    s.insert(1);
    s.insert(2);
    s.insert(3); // 重复元素不会插入
    for (int x : s) {
        cout << x << " "; // 1 2 3
    }
    if (s.find(2) != s.end()) {
        cout << "n2 存在于集合中n";
    }
    s.erase(1); // 删除元素
}
常用操作:
insert(x):插入元素(重复无效)。find(x):查找元素,返回迭代器。erase(x):删除元素。lower_bound(x) / upper_bound(x):找到大于等于 / 大于 x 的最小元素。set 就能保证唯一性和排序。lower_bound。优点:
缺点:
替代选择:
unordered_set。vector + sort + unique 可能更快。set 的特点: 唯一、有序集合,底层用红黑树实现。
优点:有序、功能全、查找插入删除稳定。
缺点:内存开销大,性能比哈希或数组差。
如果你理解了 map,set 就相当于只存“键”的版本。
 
                     
                            995M · 2025-10-31
 
                            90.9M · 2025-10-31
 
                            478M · 2025-10-31
