map类¶
约 1004 个字 118 行代码 预计阅读时间 5 分钟
map类介绍与简单使用¶
与set类不同的是,map类是KV模型的平衡二叉树(红黑树),因为是Key_Value模型,所以map类总是以key进行排序,map也是用来存储数据的,与序列式容器(forward_list)不同的是,其里面存储的是pair
)
Note
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key
和value
,key
代表键值,value
表示与key
对应的信息。下面是SGI版本的键值对定义:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
map类的特点:
- 因为底层还是类似于二叉搜索树,但是进行了优化,所以效率为\(log_{2}{N}\)
- map类中的
key
值无法被修改,一旦插入了就没有再次修改的机会 - map类支持下标访问
- map类按照
key
升序排序
map类¶
简单使用实例:
map类没有直接添加key_value键值对的构造函数,所以需要使用其他方式进行内容添加
首先介绍map类中的insert()
函数,与set类的insert()
不同的是,map类需要使用pair对象作为参数传递给insert()
函数,下面是insert()
函数原型之一
C++ | |
---|---|
1 2 3 4 5 |
|
所以在插入数据时,首先需要一个pair对象,前面提供了pair结构的原型,其中有三种构造函数
- 无参构造:
first
和second
给类型初始值 - 有参构造:给定
first
和second
对应的值进行初始化 - 拷贝构造:使用已经存在的
pair
对象构造
有了pair
对象的构造,结合insert()
函数就可以为map类添加对象,下面提供五种方式:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
上面代码中的第三种方式与下面的过程等价
C++ | |
---|---|
1 2 |
|
以二叉搜索树中:统计水果出现的次数为例
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
需要注意map中的operator[]
函数,如果想要实现在二叉搜索树中的计数,可以使用该函数
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
在map类中,operator[]
函数的本质是通过[]中的key
查找key
对应的value
值,如果key
不存在就插入,将value
设置为对应类型的默认值,如果key
存在就返回value
这个函数的调用可以类比成下面的思路:
C++ | |
---|---|
1 |
|
将其拆解为三部分:
-
c++ (this->insert(make_pair(k,mapped_type())))
该部分本质是调用了一个
insert()
函数,在map类中insert()
函数返回pair<iterator, bool>
,如果插入成功证明插入的键值对一开始不存在,返回插入后位置的迭代器,并将bool
类型的变量设置为true
表示插入成功;如果键值对一开始存在,返回存在的键值对位置的迭代器,并将bool
类型的变量设置为false
表示插入失败 -
c++ (*(pair<iterator, bool>.first))
该部分本质是调用插入节点的迭代器访问该迭代器的
first
值,因为这个键值对中的iterator
存储的成功插入或者已经存在于map中的键值对位置的迭代器,所以该迭代器指向的是一个实际的节点,即一个实际的键值对节点,解引用该节点就可以取到其中的内容 -
c++ (*iterator).second // iterator表示已经插入的节点或者原有节点位置的迭代器
该部分就是取出迭代器指向的节点中的
second
的值
所以,在map类中operator[]
可以用于下面的行为:
- 不存在[]中的
key
,插入该key
- 存在[]中的
key
,返回key对应的value
- 存在[]中的
key
,查找/修改key对应的value
multimap类¶
与map类基本相同,但是multimap类允许数据出现重复,并且multimap类不支持operator[]
函数和at
函数
基本使用与map类和multiset类似,不再做演示
题目练习¶
随机链表的复制¶
本题可以使用map进行优化,具体见链表算法部分