map分为map和multimap
https://legacy.cplusplus.com/reference/map/
我们上一篇是讲的set是key搜索场景。而本期讲的map,是key/value搜索场景。
map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型(key/value),map默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第三个模版参数,map底层存储数据的内存是从空间配置器申请的。般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,增删查改效率是 O(logN ) ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的。
map底层的红⿊树节点中的数据,使⽤pair<Key,T>存储键值对数据。
map的⽀持正向和反向迭代遍历,遍历默认按key的升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序;⽀持迭代器就意味着⽀持范围for,map⽀持修改value数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜索树的结构。
map的增删查关注以下⼏个接⼝即可: map增接⼝,插⼊的pair键值对数据,跟set所有不同,但是查和删的接⼝只⽤关键字key跟set是完全类似的,不过find返回iterator,不仅仅可以确认key在不在,还找到key映射的value,同时通过迭代还可以修改value.
前⾯我提到map⽀持修改mapped_type 数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜索树的结构。 map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map还有⼀个⾮常重要的修改接⼝operator[],但是operator[]不仅仅⽀持修改,还⽀持插⼊数据和查找数据,所以他是⼀个多功能复合接⼝。
需要注意从内部实现⻆度,map这⾥把我们传统说的value值,给的是T类型,typedef为mapped_type。⽽value_type是红⿊树结点中存储的pair键值对值。⽇常使⽤我们还是习惯将这⾥的T映射值叫做value。
由于 multimap
允许键冗余,使用 []
运算符就会出现问题。如果 multimap
支持 []
运算符,当通过一个已存在的键来使用 []
时,就不清楚应该修改这个键对应的多个值中的哪一个。例如,有一个 multimap<int, string>
,键为整数,值为字符串,键 1
对应了三个字符串 "a"
、"b"
、"c"
。如果使用 []
运算符像 myMultimap[1] = "d"
,就无法确定是要修改 "a"
、"b"
还是 "c"
,或者是要进行其他不符合预期的操作。所以,multimap
不支持 []
运算符,因为如果支持的话,在这种键冗余的情况下,[]
运算符基本上就只能用于插入新的键 - 值对(这与它在 map
中的原有功能不一致),而不能合理地支持修改操作。
本期学习结束,谢谢大家支持!!!