map的operator[]原理

目录

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值