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进行优化,具体见链表算法部分