map的operator[]
假设现在有一个统计次数的要求
int main()
{int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };map<int, int> cnt;for(auto& e : array) {cnt[e]++;}for(auto& kv : cnt) {cout<<kv.first << ':' << kv.second << endl;}return 0;
}
[官方文档]([map::operator] - C++ Reference (cplusplus.com))
mapped_type& operator[] (const key_type& k)
{(*((this->insert(make_pair(k,mapped_type()))).first)).second
}
要想理解上面的实现,我们先看一下insert的[文档](map::insert - C++ Reference (cplusplus.com))
single element (1): pair<iterator,bool> insert (const value_type& val);
============================================================
Return value
The single element versions (1) return a pair, with its member pair::first set to an iterator pointing to either the newly inserted element or to the element with an equivalent key in the map. The pair::second element in the pair is set to true if a new element was inserted or false if an equivalent key already existed.
============================================================
插入单个元素的版本(1)返回pair,其成员pair::first设置为一个迭代器,该迭代器指向新插入的元素 或 map中相同key的元素。如果插入了新元素,则pair::中的第二个元素设置为true; 如果已经存在相同key,则设置为false。
============================================================
即插入成功:返回pair<新插入的元素所在节点的iterator, true>插入失败:返回pair<已经存在元素所在节点的iterator, false>
实际上,可以简化为
// 这里将key_type简化为key,mapped_type简化为V
V& operator[](const K& key)
{pair<iterator, bool> ret = insert(make_pair(key, V()));return (ret.first)->second;
}
有个面试题:当key不在map中时,通过operator[]获取对应value时会发生什么问题?
答:当key不存在时,operator[]用默认value与key构造键值对然后插入,返回该默认value的引用