文章目录
一、集合set
set称为集合,是一个内部自动有序且不含重复元素的容器。set容器的特性,相比map没有value的值,只有key的元素在里面了,底层实现仍然是用红黑树实现的。
二、所需的头文件
#include <set>
三、基本访问操作
3.1 插入元素
set<类型> s;//定义方式 集合内的元素是不重复的 类似map中的key元素,但是没有对应的value
s.inert(1);//插入元素1
3.2 删除元素
删除元素的方法有三种
s.erase(it);//it为元素值为1的迭代器。
s.erase(1);//直接删除值为1的元素。
s.erase(first, last);//删除[first,last)内的所有元素其中first为起始元素的迭代器,last为删除区间的末尾迭代器的下一个。
3.3 查找元素
auto it=s.find(1);
printf("%d",*it);//1
3.4 其他函数
s.clear();//清空集合
s.size();//集合元素的个数
s.empty();//判断集合是否为空
四、无序集合unordered_set
unordered_set和set基本相同,也是不允许有重复元素。集合不会被排序,底层实现是哈希表(hash)存储结构。只是set内的元素是有序的,set自动排序。unordered_set是无序的,按插入元素先后顺序排列。且unordered_set没有rbegin和rend函数。
#include <unordered_set>//引入头文件
unordered_set<int>s1;
五、multiset
//multiset 集合数据可以重复
multiset ms {8, 7, 6, 5, 4, 3, 2, 1};
多表集合的结构与set 相似,底层原理一致,但是key的值如果有相同的数据,就会再用一个vector来进行存储。
多表集合可以允许有多个重复的键值。
六、unordered_multiset
无序多表集合
unordered_multiset ums;
特点:
- 该容器底层是哈希表实现
- 里面的key既不会去重,也不会排序
- 用法与unordered_set类似
- 虽然不会排序,但重复的数据也会排列在一起
七、使用set容器
//set 对应map 去重排序
set<int> s = { 2, 5, 4, 7, 9, 6, 4, 3, 5, 8, 0, 5, 34, 23 };
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
//结果:0 2 3 4 5 6 7 8 9 23 34
//multiset 对应multimap 排序
multiset<int> ms = { 2, 5, 4, 7, 9, 6, 4, 3, 5, 8, 0, 5, 34, 23 };
for (auto e : ms)
{
cout << e << " ";
}
cout << endl;
//结果:0 2 3 4 4 5 5 5 6 7 8 9 23 34
八、map与set的区别
容器 | 底层 | 是否去重 | 是否排序 | 对应无值的容器 |
---|---|---|---|---|
map | 红黑树 | 是 | 是 | set |
multimap | 红黑树 | 否 | 是 | multiset |
unordered_map | 哈希表 | 是 | 否 | unordered_set |
unordered_multimap | 哈希表 | 否 | 否 | unordered_multiset |