引言
在STL中,有两种很常见的关联容器,分别是set和map,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的。所以关联容器经常用在关键字的查找中,效率很高,这里就简单介绍一下这两种容器,为下面即将学到的一种数据结构**哈希表(散列表)**做一个基础铺垫。
set/multiset/unordered_set容器
简介
set里面每个元素只存有一个key,保证查询的高效性,且所有元素都会在插入时被自动排序
set其实就类似于数学中的集合
本质
set的底层是由红黑树实现的(一种平衡二叉搜索树)
特点
不会出现重复的元素
会由元素大小自动排序
无法直接修改元素
高效的插入删除操作
下面介绍一些基本操作(这里就着重介绍set一些不同的,大部分内容和之前一些容器的操作是一样的)
插入和删除
set增添元素就需要用到insert,因为它并没有push之类的操作,其余的操作还是有类似的
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(begin, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。(这个直接删除很方便)
查找和统计
⚠️查找需要尤为注意,因为很多时候都要用到查找操作,一定要注意它的返回值是一个迭代器,还有查找失败时返回的是set.end()
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
set和multiset的主要区别就在于
set不予许插入重复的数据
multiset允许插入重复的数据
对于unordered_set,它和set的区别在于
unordered_set底层实现是哈希表,所以当我们需要使用集合来解决哈希问题时,优先选择unordered_set,因为它的查询和插入删除操作是最优的;
其实set/multiset/unordered_set这三种区别不是特被大,这里一些基本操作都是通用的,所以就不重复介绍了,记住它们间的不同点即可
map/multimap/unordered_map
简介
map是一种key-value型容器,即所有的数据都是pair(pair可以创建一个对组,同时返回的是两个数据pair<type1, type2> p)
pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值),所以可以理解为:map其实就是数学中的映射;
本质
map的底层实现也是红黑树
特点
高效的插入和删除操作
查找元素迅速(由key找到value)
可以通过key修改value的值
支持[]下标访问
所有元素会根据元素键值(key)进行排序(和value无关)
基本操作
构造(注意:key和value的类型可以不相同的,如果还是不明白,建议看看pair的操作就清楚了)
map<T1, T2> m;
插入和删除(和set没什么大区别)
insert(elem); //在容器中插入元素。
这里插入注意一下,有四种插入方法
map<int, int> m;
//第一种插入方式
m.insert(pair<int, int>(1, 10));
//第二种插入方式
m.insert(make_pair(2, 20));
//第三种插入方式
m.insert(map<int, int>::value_type(3, 30));
//第四种插入方式
m[4] = 40; //重载了[]
这里建议用前两中的一种,哪个顺眼用哪个,后两种了解即可
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(key); //删除容器中值为key的元素。
查找和统计(set一样)
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
count(key); //统计key的元素个数
map和multimap区别:
map不允许容器中有重复key值元素
multimap允许容器中有重复key值元素
map和unordered_map区别:
unordered_map底层实现是哈希表,查找效率更高,同样在哈希问题中优先选择;
总结
这里其实只是简单介绍了一下set和map,很多东西都有省略,目的其实为了接下来的哈希表的学习,它们区别只有真正使用才能体会出来,这里只做一个初步了解就可以了;