set 类的实现
set 的声明中,T 代表底层关键字类型。默认要求 T 支持比较运算,若需自定义规则可传入仿函数作为第二个模板参数。内存分配方面,底层从空间配置器申请,也可自行实现内存池。
set 基于红黑树实现,增删查复杂度为 O(logN)。迭代器遍历遵循中序遍历,因此数据天然有序(升序)。
set 的构造和迭代器
插入整数时,set<int> s 会自动完成排序与去重。
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
// set<int, greater<int>> s; // 降序排列
s.insert(4);
s.insert(3);
s.insert(8);
s.insert(9);
s.insert(2);
s.insert(6);
auto it = s.begin();
while (it != s.end()) {
cout << *it << " ";
++it;
}
cout << endl; // 输出:2 3 4 6 8 9
return 0;
}
注意:set 不支持修改元素值,一旦修改会破坏红黑树结构,编译器通常会报错。
支持 initializer_list 初始化,重复插入会被忽略。
set: erase 和 find
删除最小值可直接使用 s.erase(s.begin())。
查找元素时,容器自身的 find 效率高于算法库的 find(O(logN) vs O(N))。
// 直接删除指定值,返回删除的元素个数
int num = s.erase(x);
(num == ) {
cout << x << << endl;
} {
cout << x << << endl;
}
pos = s.(x);
(pos != s.()) {
s.(pos);
cout << x << << endl;
}


