基本概念
set是一个关联容器类型,用于以升序方式存储唯一值。
- 属于关联容器(关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。)
特性
- 遵循数学集合三特性,互异性、无序性、确定性。
- 底层数据结构为红黑树,有序,不重复
- set 容器只是单纯的键的集合。每个元素仅包含一个键(key),并有效地支持关于某个键是否存在的查询
- set 容器存储的键也必须唯一,而且不能修改
- set 容器以升序方式存储唯一值
- set 不支持下标操作符
- 和map一样,set无法存储无法比较大小的数据;
头文件
模板
1
| set<int,greater<int> >q;
|
set初始化方法
1 2
| set<int>q; set<int> numbers {8, 7, 6, 5, 4, 3, 2, 1};
|
小的在前(less)/大的在前(greater)
默认的比较函数是 less,因此容器中的元素会升序排列。
1 2
| set<int, less<int>> set1; 小的在前(less),升序 set<int, greater<int>> set1; 大的在前(greater),降序
|
参考:C++ STL set greater less详解
交换
swap(set<T>& other)
:和参数的元素进行交换,所包含对象的类型必须相同。:将当前 set 中的元素和参数 set 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。
1 2
| void swap(set<T> &x) 重载1:x.swap(y) void swap(set<T> &x, set<T> &y) 重载2: swap(x, y)
|
常用操作
插入
1 2 3 4 5 6 7
| int a[] = {1,2,3,4,5}; set<int>q;
q.insert(elem)); 集合中插入元素 q.insert(a,a+5); 插入数组a至a+5的元素 q.insert(pos, elem); 在容器中插入元素elem的一份拷贝,并返回新元素的iterator位置; q.insert(beg, end); 在容器中插入[beg, end)范围中所有元素的拷贝,没有返回值。
|
删除与清空
1 2 3 4 5 6
| q.erase(iterator pos); 删除集合中的元素 无返回值 删除后pos不会自动++!被删除元素的迭代器,在删除之后失效!这里是和vector的区别
q.erase(iterator first, iterator last); 移除迭代区间[first,last)内的所有元素,无返回值 q.erase(value); 移除set容器内元素值为value的所有元素,返回移除元素的个数(size_type类型) q.clear(); 删除set容器中的所有的元素,无返回值
|
大小/是否为空
1 2 3
| q.size(); 返回当前set容器中的元素个数 q.max_size(); 返回set容器可能包含的元素最大个数 q.empty(); 判断set容器是否为空
|
find和count
1 2
| q.find(element); 返回element值位置的迭代器,找不到返回q.end() q.count(); 返回某个值元素的个数(根据set的特性,就是判断这个元素在不在,返回0或1)
|
迭代器
1 2 3 4
| q.begin(); q.end(); q.rbegin(); q.rend();
|
大于等于元素的迭代器
1 2
| q.lower_bound(); 返回指向大于(或等于)某值的第一个元素的迭代器 q.upper_bound(); 返回大于某个值元素的迭代器
|
参考资料
C++ set初始化(STL set初始化)详解
C++标准库容器类概述
C++ STL set greater less详解
本文许可证
本文遵循 CC BY-NC-SA 4.0(署名 - 非商业性使用 - 相同方式共享) 协议,转载请注明出处,不得用于商业目的。