映射

Map的特性是:所有的元素都会根据键值自动排列。Map的所有元素都是pair,同时拥有实值(Value) 和 键值(Key)。Pair的第一元素被视为键值,第二元素被视为实值。Map不允许两个元素拥有相同的键值。

下面是Pair的定义:

 

我们可以通过map的迭代器改变map的元素内容吗?

如果是想要修正元素的键值,那是不行的,因为map元素的键值关系到了map的元素的排列顺序。任意改变map的元素键值将会严重破坏map组织。如果是修改元素的实值的话,那是可以的,因为并不会影响map的排列规则。

因此,map iterators 既不是一种constant iterator ,也不是一种 mutable iterators

map 和 list 在迭代器方面有一点相似,就是进行插入和删除操作的时候操作之前的迭代器在操作之后都是有效的。当然删除元素操作所删除的迭代器除外。

Map的 底层是 RBTree,Map 具体实现如下:

注释不多,看完就懂了。

同样的一个测试程序:

 

然后这里详细讲述一下 map的 [] 操作符…这个操作符真可谓是复杂。

不过我觉得设计的很精妙啊!实现函数如下:

一层一层真是难…我们来分析下:

首先根据键值和实值,我们造一个元素出来…

然后插入到map里面去

插入返回一个pair,第一个元素是迭代器,指向插入的元素或者之前已经存在的相同键值的元素。

所以取出第一个元素first

这个first 是一个迭代器,指向被插入的元素

所以我们对他进行解析(解引用,提领):

得到的是map的元素,由键值和实值组成,第二元素就是实值,第一元素是键值

取第二元素,得到它的实值。

最后注意,是以引用方式传递过去的。这样它作为左值和右值都可以。

【STL】Map
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
最新
最旧 最多投票
内联反馈
查看所有评论