map的operator[]的实现
operator[]里包含插入操作,所以我们先看一下首先看一下map的insert函数
返回值是一个pair类型。正常的常见的insert,插入成功返回true,失败返回false
这里设计的insert不单单返回布尔值,而是返回一个pair类型,包含迭代器和布尔值。就是为了实现operator[]
插入规则:
- key已经在map中,返回
pair(key_iterator, false)
(返回key位置的迭代器) - key不在map中,返回
pair(newly_inserted_iterator, true)
(返回新插入元素的迭代器)
所以,insert也充当了查找的作用
那么operator[]是如何实现的呢?
operator[key]:
- 若key存在,返回value的引用
- 若key不存在,新插入一个pair(key, value()),并返回value的引用
所以operator不管怎样,都会返回key对应的value的引用,只是有可能value是新插入的。因此就可以这样来写:
V& operator[](const K& key){pair<iterator,bool> ret = insert(make_pair(key,V()));return ret.first->second;
}// 简写:
V& operator[](const K& key){return ((insert(make_pair(key,V()))).first)->second;
}
这里有两个pair。一个是insert的返回值的pair<iterator,bool> ;另一个是iterator指向的元素 pair<key_type,value_type>