1、set的介绍
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
- set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- 在底层是用二叉搜索树(红黑树)实现的
- T: set中存放元素的类型,实际在底层存储<value, value>的键值对。
- Compare:set中元素默认按照小于来比较
- Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理
2、set的初始化
2.1、方法1
set<int> first; // empty set of ints
2.2、方法2
int myints[] = { 10,20,30,40,50 };
set<int> second(myints, myints + 5); // range
2.3、方法3
// 拷贝构造
set<int> third(second); // a copy of second
2.4、方法4
// 迭代器
set<int> fourth(second.begin(), second.end()); // iterator ctor.
3、 set的常用内置函数使用
3.1迭代器
set<int> v = { 1,2,3,4,5,6,7 };
//Iterators(迭代器)
v.begin(); //获取第一个数的位置
v.end(); //获取最后一个数的位置
v.rbegin(); //获取最后一个数的位置
v.rend(); //获取第一个数的位置
3.2容量
set<int> v = { 1,2,3,4,5,6,7 };
//Capacity(容量)
v.size(); //获取v数据的个数
v.max_size(); //返回字符串可以达到的最大长度
v.empty(); //判断v是否为空
3.3修改器
set<int> v = { 1,2,3,4,5,6,7 };
set<int> v1 = { 10,20,30 };
int arr[] = {100,200,300};
//Modifiers(修改器)
v.insert(90); //插入元素
v.insert(v.begin(), 100); //在pos前插入元素
v.insert(arr,arr+3);
v.erase(v.begin()); //删除set中position位置上的元素
v.erase(1); //删除set中值为x的元素,返回删除的元素的个数
v.erase(v.begin(), v.end()); //删除set中[first, last)区间中的元素
v.clear(); //检测set是否为空,空返回true,否则返回true
v.swap(v1); //交换
3.4操作
set<int> v = { 1,2,3,4,5,6,7 };
//operations(操作)
iterator find(constkey_type & x) const;
v.find(1); //返回set中值为x的元素的迭代器位置
v.count(1); //返回set中值为x的元素的个数
4、set的遍历
4.2迭代器
set<int> v = { 1,2,3,4,5,6,7 };
set<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
4.3范围for
set<int> v = { 1,2,3,4,5,6,7 };
for (auto e : v)
{
cout << e << " ";
}
总结
- set与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
- 使用set的迭代器遍历set中的元素,可以得到有序序列
- set中的元素默认按照小于来比较
- set中查找某个元素,时间复杂度为:log2n
- set中的元素不允许修改(为什么?)
- set中的底层使用二叉搜索树(红黑树)来实现