【C++学习篇】map和set (map篇)

目录

​编辑

 1.map系列的使用

1.1map和multimap参考文档

 1.2map类的介绍

1.3pair类介绍 

1.4map的构造 

1.5 map的增删查

1.6 map的数据修改

1.7 map 和 multimap的区别


 

 1.map系列的使用

map分为map和multimap

1.1map和multimap参考文档

参考文档icon-default.png?t=O83Ahttps://legacy.cplusplus.com/reference/map/

 1.2map类的介绍

我们上一篇是讲的set是key搜索场景。而本期讲的map,是key/value搜索场景。

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型(key/value),map默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第三个模版参数,map底层存储数据的内存是从空间配置器申请的。般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,增删查改效率是 O(logN ) ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的。

1.3pair类介绍 

 map底层的红⿊树节点中的数据,使⽤pair<Key,T>存储键值对数据。

 

 

1.4map的构造 

map的⽀持正向和反向迭代遍历,遍历默认按key的升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序;⽀持迭代器就意味着⽀持范围for,map⽀持修改value数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜索树的结构。 

 

1.5 map的增删查

map的增删查关注以下⼏个接⼝即可:
map增接⼝,插⼊的pair键值对数据,跟set所有不同,但是查和删的接⼝只⽤关键字key跟set是完全类似的,不过find返回iterator,不仅仅可以确认key在不在,还找到key映射的value,同时通过迭代还可以修改value.

 

 

1.6 map的数据修改

前⾯我提到map⽀持修改mapped_type 数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜索树的结构。
map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map还有⼀个⾮常重要的修改接⼝operator[],但是operator[]不仅仅⽀持修改,还⽀持插⼊数据和查找数据,所以他是⼀个多功能复合接⼝。

需要注意从内部实现⻆度,map这⾥把我们传统说的value值,给的是T类型,typedef为mapped_type。⽽value_type是红⿊树结点中存储的pair键值对值。⽇常使⽤我们还是习惯将这⾥的T映射值叫做value。 

 

1.7 map 和 multimap的区别

由于 multimap 允许键冗余,使用 [] 运算符就会出现问题。如果 multimap 支持 [] 运算符,当通过一个已存在的键来使用 [] 时,就不清楚应该修改这个键对应的多个值中的哪一个。例如,有一个 multimap<int, string>,键为整数,值为字符串,键 1 对应了三个字符串 "a""b""c"。如果使用 [] 运算符像 myMultimap[1] = "d",就无法确定是要修改 "a""b" 还是 "c",或者是要进行其他不符合预期的操作。所以,multimap 不支持 [] 运算符,因为如果支持的话,在这种键冗余的情况下,[] 运算符基本上就只能用于插入新的键 - 值对(这与它在 map 中的原有功能不一致),而不能合理地支持修改操作。

 

​​​​​​​本期学习结束,谢谢大家支持!!!

评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

讲真的吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值