1. 头文件
#include <set>
2. 定义和性质
- 关联容器,元素唯一(区别于multiset),且元素有序(区别于unordered_set)
- set中元素不能直接改变,会破坏set的结构
- 内部采用红黑树RB Tree实现,一种非严格意义的二叉查找树
- set中只包含关键字,而不是键值对
- 原型:参数1为数据类型,参数2默认是升序less,参数3一般用不到
template <class T,
class Compare = less<T>,
class Alloc = allocator<T>
> class set;
3. 构造
set<int> a;
set<int> a{1, 2, 3};
set<int> b(a);
set<int> b(a.begin(), a.end());
set<int, std::greater<int>> a;
4. 常用方法
方法 | 说明 |
---|
mySet.size(); | 容器大小 |
mySet.max_size(); | 容器最大容量 |
mySet.empty(); | 是否为空 |
方法 | 说明 |
---|
mySet.insert(const T& ele); | 添加元素 |
mySet.insert(iterator it, const T& ele); | 某个位置(之前)插入元素 |
mySet.insert(set2.first, set2.last); | 插入另一个set中[first, last)元素 |
方法 | 说明 |
---|
mySet.erase(const T& ele); | 删除某个元素 |
mySet.erase(iterator it); | 删除迭代器所指的元素 |
mySet.erase(iterator first, iterator last); | 删除[first, last)迭代器区间元素 |
mySet.clear(); | 清空所有元素 |
方法 | 说明 |
---|
mySet.find(element); | 查找某个元素,成功返回迭代器,识别返回end() |
mySet.count(element); | 返回0或1,set中元素唯一,不是很实用 |
set<int>::iterator it = mySet.lower_bound(key);
set<int>::iterator it = mySet.upper_bound(key);
pair<set<int>::iterator first, set<int>::iterator last> s_pair
= mySet.equal_range(key);
lower_bound, 不小于;upper_bound, 大于;equal_range, 迭代器范围
方法 | 说明 |
---|
mySet.swap(set<T>& anotherSet); | 交换两个容器的元素 |
swap(set1, set2); | 另一种形式 |
方法 | 说明 |
---|
begin()/end() | 正向迭代器 |
rbegin()/rend() | 反向迭代器 |
cbegin()/cend() | const迭代器 |
注:可以通过next/prev/advance函数访问特定迭代器元素
5. 总结
- 插入元素使用insert或emplace,不能用push_back/front
- set不支持resize()/at()函数,查找元素使用find或count
- set元素自动排序,不支持STL的reverse和sort算法
- set的要点:RB Tree,有序,唯一
- set查找和插入元素的时间复杂度O(logN)二分查找,对数时间复杂度
参考文章
set容器的定义和方法
set容器的方法实例
created by shuaixio, 2021.06.17