当前位置:首页 > 编程笔记 > 正文
已解决

map的operator[]原理

来自网友在路上 197897提问 提问时间:2023-11-04 03:13:28阅读次数: 97

最佳答案 问答题库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%的人还看了

猜你感兴趣

版权申明

本文"map的operator[]原理":http://eshow365.cn/6-31462-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!