map的operator[]原理
最佳答案 问答题库978位专家为你答疑解惑
目录
一.map的insert函数
二.map的operator[]实现
三.operator[]的多重功能
一.map的insert函数
要想了解operator[]的实现原理,就要先看看insert。我们关注的是第一个insert的返回值,即pair<iterator, bool>
大意就是,返回一个pair对象,它的第一个成员first是一个迭代器,要么指向新插入的元素,要么指向map中原来就存在的元素,这个元素的key和要插入元素的key相等。第二个成员first是一个bool变量,如果是true表示插入成功,如果是false表示map中存在和待插入元素key值相等的元素,插入失败。
插入成功:返回pair<新插入的结点所在的iterator, true>
插入失败:返回pair<已经存在的key值相同结点所在的iterator,false>
小结:insert返回值中的迭代器无论如何都会指向指定key值的结点,只不过这个结点可能是新插入的,也可能是原来就存在的
关于insert函数参数的更多介绍,可以参考我写的上一篇文章 :
用pair<string, string>构造pair<const string, string>
二.map的operator[]实现
我们知道map是key_value模型的搜索二叉树key_type就是key的数据类型,mapped_type就是value的数据类型
以上就是operator[]函数的返回值,可以看到它复用了insert函数的代码,下面我们就来抽丝剥茧,一层层的分析这句代码。
首先是最里面一层,make_pair会返回一个pair<const key_type, mapped_type>类型的对象,这个pair的first值为k,second值为mapped_type类型的默认值,例如int的默认值是0,string的默认值是一个空string。
接着,将make_pair返回的对象作为参数传给insert,insert会返回一个pair<iterator,bool> 对象。如果map中已经有了key值为k的结点,那么插入失败,这个pair的first指向该结点,second为false;如果map中不存在这样的结点,那么插入成功,pair的first指向新插入的结点,second为true。
取insert返回值的first成员,即结点的iterator
再对iterator解引用,找到结点的second值,即结点的value。要注意的是,operator[]的返回值是引用,所以这里返回的不是对于value的拷贝,而是value引用,这意味着可以通过operator[]来修改结点的value值。
三.operator[]的多重功能
operator[]的三种功能:插入,修改,查找。
int main()
{map<string, string> dict;dict["left"];//插入功能dict["left"] = "左边";//修改功能cout << dict["left"] << endl;//查找功能dict["right"] = "右边";//插入+修改(将空string修改为“右边”)return 0;
}
99%的人还看了
相似问题
- 【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点
- 【数据结构初阶(3)】双向带头结点循环链表
- 单链表相关面试题--4.输入一个链表,输出该链表中倒数第k个结点
- 王道数据结构课后代码题p150 15.设有一棵满二叉树(所有结点值均不同),已知其先序序列为 pre,设计一个算法求其后序序列post。(c语言代码实现)
- 【数据结构】树的基本性质(计算树的总结点数与叶结点数)
- 【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)
- NowCoder | 链表中倒数第k个结点
- 设一棵完全二叉树具有1000个结点,则此完全二叉树有()叶子结点,有()个度为2的结点。
- 11.3递归建二叉树,二叉树函数规范化输入输出,一些二叉树性质,求叶子结点与树的高度
- 二叉树第i层结点个数
猜你感兴趣
版权申明
本文"map的operator[]原理":http://eshow365.cn/6-31462-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 【Git企业开发】第四节.Git的分支管理策略和bug分支
- 下一篇: Vue纯CSS实现掷色子