set/multiset/unordered_set和map/multimap/unordered_map基础汇总

本文介绍了STL中的关联容器set和map,它们基于红黑树实现,提供高效的查找和操作。set不允许重复元素,而multiset允许;unordered_set和unordered_map使用哈希表,查询速度更快。map是键值对容器,支持通过key修改value。这些容器在实际使用中的选择取决于具体需求和性能考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

在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,很多东西都有省略,目的其实为了接下来的哈希表的学习,它们区别只有真正使用才能体会出来,这里只做一个初步了解就可以了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YXXYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值