前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C++学习篇】map和set (map篇)

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

作者头像
是预备程序员a
发布2024-12-25 10:09:24
发布2024-12-25 10:09:24
910
举报
文章被收录于专栏:C++C++

1.map系列的使用

map分为map和multimap

1.1map和multimap参考文档

参考文档

https://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 中的原有功能不一致),而不能合理地支持修改操作。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.map系列的使用
    • 1.1map和multimap参考文档
    • 1.2map类的介绍
    • 1.3pair类介绍
    • 1.4map的构造
    • 1.5 map的增删查
    • 1.6 map的数据修改
    • 1.7 map 和 multimap的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档