set学习笔记
2023-01-30 18:43:04
set 是一个有序集合,具有互异性
STL 的 set 集合用二叉树实现的,集合中的每个元素只出现一次,并且是排好序的(默认按键值升序排列),访问元素的时间复杂度是 $O(\log_2n)$
```c++
set<int> s; // 以int型为例 默认按键值升序
set<int,greater<int>> s; // 降序排列
s.insert(x); // 将x插入
s.erase(x); // 删除x元素,返回0或1,0表示set中不存在
s.clear(); // 清空
s.empty(); // 判断是否为空,若是返回1,否则返回0
s.size(); // 返回元素的个数
s.find(x); // 查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 s.end()
s.lower_bound(x); // 返回一个迭代器,指向第一个键值不小于x的元素
s.upper_bound(x); // 返回一个迭代器,指向第一个键值大于x的元素
s.rend(); // 返回第一个元素的的前一个元素迭代器
s.begin(); // 返回指向第一个元素的迭代器
s.end(); // 返回指向q最后一个元素下一个位置的迭代器
s.rbegin(); // 返回最后一个元素
```
_注:lower\_bound 和 upper\_bound 不是 set 特有的。_
```cpp
#include <iostream>
#include <set>
using namespace std;
set<int > s;
void print(){
for(auto it = s.begin(); it != s.end(); it++){
cout << *it << " ";
}cout << endl;
}
int main() {
s.insert(1);
s.insert(4);
s.insert(2);
cout << "lower_bound " << *q.lower_bound(2) << endl; //返回2
cout << "upper_bound " << *q.upper_bound(2) << endl; //返回4
print(); //有序的
//因为 set 是有序的,所以给一个下标插入是无意义的
s.insert(s.begin(),5);
print();
s.clear(); //清除
s.insert(2);
s.insert(2);
s.insert(2);
s.insert(2);
s.insert(2);
print(); //互异的
return 0;
}
```
删除数据
```cpp
#include <iostream>
#include <set>
using namespace std;
set<int > s;
void print(){
for(auto it = s.begin(); it != s.end(); it++){
cout << *it << " ";
}cout << endl;
}
int main() {
s.insert(1);
s.insert(4);
s.insert(2);
print();
s.erase(s.begin()); //可以给定下标删除
print();
s.insert(1);
s.erase(2); //因为没有重复的,可以直接给定内容删除
print();
return 0;
}
```