set
(set)头文件主要包括(set)和(multiset)两个容器。他们都是有序集合,不过(set)存的元素不可重复。
两者内部实现都是红黑树,在使用方法上差别不大,支持的函数基本相同。
声明方式
set<int> s;
multiset<int> t;
set<int>::iterator it;
(s)与(t)都是维护(int)类型数据的有序容器,其中(t)内的元素可重。迭代器(it)仅支持(++)和(--)。我们以(int)类型的数据为例:
s.size()
返回元素个数。
s.empty()
判断(set)是否为空,为空则是逻辑真,否则就是逻辑假。
s.clear()
清空(set)。
s.begin()/s.end()
返回(set)的首迭代器和尾迭代器。左闭右开,所以尾迭代器为空。
s.insert(x)/s.erase(it/x)
插入一个(int)类型的数据,删除一个迭代器或者元素(x)。如果(x)已经是在集合中的了,并且是(set)而不是(multiset),那么就不会执行插入操作。时间复杂度为(O(log))。如果是(multiset)则会把所有等于(x)的元素全部删除,复杂度为(O(log+k)),(k)为元素个数。
s.find(x)
查找等于(x)的元素,返回一个迭代器。若不存在,则返回(s.end())。复杂度(O(log))的。
s.lower_bound(x)/s.upper_bound(x)
第一个是找(set)中大于等于(x)的最小的元素,第二个是找(set)中严格大于(x)的最小的元素,以迭代器的形式返回。时间复杂度为(O(log))。若不存在,则返回(s.end)()。
s.count(x)
返回集合中等于(x)的元素个数。复杂度为(O(log+k)),(k)为元素个数。