目录
一.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;
}