set
类型:集合,内部有序且不含重复元素
头文件:#include<set>
定义:set<typename> name; (如set<int> a)
访问
只能通过迭代器(iterator)访问:
set<typename>::iterator it;
#include<cstdio>
#include<set>
using namespace std;
int main(){
set<int> st;
st.insert(3);
st.insert(5);
//注意,不支持it < st.end()的写法
for(set<int>::iterator it = st.begin(); it != st.end(); it++){ //遍历vector
printf("%d ", *it);
}
return 0;
}
注:set不可使用st.begin()+3这种迭代器加数字的写法。set内元素自动递增排序,且自动除去重复元素。
函数
- find(value):返回set中对应值为value的地址,未找到时返回st.end(),时间复杂度 O ( l o g n ) O(logn) O(logn)。
- size():获取set中元素个数,时间复杂度 O ( 1 ) O(1) O(1)。
- clear():清空set中元素,时间复杂度 O ( n ) O(n) O(n)。
- insert(x):将x插入set中,时间复杂度 O ( l o g n ) O(logn) O(logn)。
- erase():erase(it),删除指定单个元素,时间复杂度 O ( 1 ) O(1) O(1);erase(value),删除值为value的数,时间复杂度 O ( l o g n ) O(logn) O(logn);erase(first, last),删除区间左闭右开[first, last)的所有元素;时间复杂度 O ( l a s t − f i r s t ) O(last-first) O(last−first)。
- begin():获得set首元素地址。
- end():获得set尾元素地址的下一位。
- empty():判空。
用途
最主要的作用在于自动去重并按升序排序。
延伸:set中元素是唯一的,如果需要处理不唯一的情况,则可使用multiset。另外,C++11标准中增加了unordered_set,以散列代替set内部的红黑树实现,使其可以用来处理只去重但不排序的要求,速度远高于set。
延伸内容待更新
参考资料
[1]. 《算法笔记》P197-202