C++:STL------set
1.about
头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集”,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一颗红黑树(平衡树的一种),它们支持的函数基本相同。
2.声明
#include <set> //头文件
set<int> s1; //存储int的有序集合set
struct rec{...};
set<rec> s2;
multiset<double> s3;
set<Type> s //定义一个set容器
set<Type> s(s1) //定义一个set容器,并用容器s1来初始化
set<Type> s(b, e) //b和e分别为迭代器的开始和结束的标记
set<Type> s(s1.begin(), s1.begin()+3) //用容器s1的第0个到第2个值初始化s
set<Type> s(a, a + 5) //将a数组的元素初始化vec向量,不包括a[4]
set<Type> s(&a[1], &a[4]) //将a[1]~a[4]范围内的元素作为s的初始值
set和multiset存储的元素必须定义“小于号”运算符。
3.迭代器
set和multiset的迭代器称为“双向访问迭代器”。不支持“随机访问”,支持星号 (*) 解除引用,仅支持“++”和“–”两个与算术相关的操作。
set<int>::iterator it;
it = s.begin();
it++;
//it将指向“下一个”元素。这里的“下一个”是指在元素从小到大排序的结果中,排在it下一名的元素。
it--;
//同理,it将会指向排在“上一个”的元素。
//执行“++”和“--”操作的时间复杂度都是O(logn)。
//执行操作前后,务必仔细检查,避免迭代器指向的位置超出首、尾迭代器之间的范围。
4.method
方法 | 描述 | 实例 | 时间复杂度 |
---|---|---|---|
size | 实际长度(包含的元素个数) | int x = s.size(); | O(1) |
empty | 是否为空 | bool y = s.empty(); | O(1) |
clear | 清空 | s.clear(); | O(n) |
begin | 返回集合的首迭代器 | set::iterator it1 = s.begin(); | O(1) |
end | 返回集合的尾迭代器 | set::iterator it2 = s.end(); | O(1) |
insert | 将一个元素插入到集合 | s.insert(x); | O(logn) |
find | 在集合中查找等于x的元素,并返回指向该元素的迭代器。如不存在,返回s.end() | set::iterator it = s.find(x); | O(logn) |
lower_bound | 查找>=x的元素中最小的一个,并返回指向该元素的迭代器 | set::iterator it = s.lower_bound(x); | O(logn) |
upper_bound | 查找>x的元素中最小的一个,并返回指向该元素的迭代器 | set::iterator it = s.upper_bound(x); | O(logn) |
erase | 从集合中删除迭代器 it 指向的元素 从集合中删除所有等于x的元素 | s.erase(it); s.erase(x); | O(logn) O(k+logn),k为被删除元素个数 |
count | 返回集合中等于x的元素个数 | int y = s.count(x); | O(k+logn),k为元素x个数 |