std::map下标运算符插入键值对的原理问询
理解std::map下标运算符的插入逻辑
咱们一步一步拆解mapped["current"] = 5;的执行过程,结合你看到的那行insert代码来分析:
- 首先,当你调用
mapped["current"]时,std::map的operator[]会先检查键"current"是否已经存在于map中。此时你的map是空的,所以找不到这个键。 - 接下来就会执行你提到的那行代码:
__i = insert(__i, value_type(__k, mapped_type()));- 先看
value_type(__k, mapped_type()):std::map<std::string,int>的value_type是std::pair<const std::string, int>,mapped_type()就是int(),也就是int类型的默认构造值——0。所以这一步会构造一个临时的键值对:std::pair<const std::string, int>("current", 0)。 - 然后调用
insert(__i, ...):这里的__i是一个迭代器,作为插入的提示位置(主要是给红黑树结构做插入优化,不影响最终结果)。insert操作会把这个临时键值对插入到map的正确位置,然后返回指向这个新插入元素的迭代器,赋值给__i。
- 先看
- 之后,
operator[]会返回这个新插入元素的second成员的引用——也就是那个int&,它现在指向的是刚才插入的默认值0。 - 最后执行赋值操作
=5,把这个引用指向的值从0改成5。
到这里,map里就正式有了"current":5这个键值对啦。
内容的提问来源于stack exchange,提问作者tariq zafar
相关产品推荐
相关产品推荐

