set,翻译为集合。是一个可以插入元素时自动从小到大排序且自动去重的 STL 容器。说直白点,就是一个桶,加了很多自定义函数。set 的内部是一个红黑树,支持的数据类型有整型,浮点型,字符型,字符串等。
需要的头文件:
#include<set>
包含在
#include<bits/stdc++.h>
如何定义 set?
set 的定义格式:
set<typename> name;
例:
set<int> s;
如上所说,其中的 typename 可以为整型,浮点型,字符型,字符串等。还可以为其他 STL 容器,如 set,queue,vector 等。
set 数组的定义格式:
set<typename> Arrayname[Arraysize];
例:
set<int> s[105];
如此,s[0] 至 s[Arraysize-1] 皆为 set 容器。
如何访问 set?
set 只能用迭代器访问。
set<typename>:: iterator it;
其中 typename 为 set 定义时的类型。
对于 c++11 及以上的朋友们,有个福利,即是将迭代器的定义移交给关键字 auto。
auto it=a.begin();
auto 会自动识别数据类型,避免忘了迭代器的定义。
可以通过迭代器 *it 访问 set 中的元素。
可以发现,set 有自动去重且自动排序的功能。印证了上面所陈述的功能。
除 vector,set,string 的STL容器都不可以用 *(it+1) 的遍历方式。
set 常用内置函数:
(1) insert():
s.insert(x) 可将 x 插入到 s 的最后,并自动去重及排序。时间复杂度 O(logN),N 为 s 中的元素个数。
(2) find():
s.find(value),返回值为 value 的迭代器,找不到则返回s.end()。时间复杂度 O(logN),N 为 s 中的元素个数。
(3) size():
s.size(),返回的 s 中的元素个数,时间复杂度为 O(1)。
(4) clear():
s.clear() 将 s 清空。时间复杂度为 O(N),N 为 s 中的元素个数。
(4) erase():
erase() 有两种方法: 删除单个元素、删除一个区间内的所有元素。
1.删除单个元素。s.erase(it)。it 为需要删除元素的迭代器。时间复杂度为O(1)。
可以结合 find() 来使用:s.erase(s.find(value)) 。
如果要删除一个数值,s.erase(value),时间复杂度 O(logN),N 为 s 中的元素个数。
2. 删除一个区间的元素。
s.erase(first,last) 可以删除一个区间内的所有元素。
其中 first 为所需删除区间的起始迭代器,而 last 则为所需要删除区间的末尾迭代器的下一个地址,即删除 [first,last) 内的所有元素。时间复杂度为 O(last-first)。