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>