std :: map实现中的operator []

时间:2016-10-12 23:24:32

标签: c++ stl

我正在尝试在C ++中实现像std::map这样的容器。重载operator []时我有一个小查询。我看到这个操作符有两种工作方式:

  1. mymap[2] - 在这种情况下,它会在地图中查找键2,并根据此键返回值。
  2. mymap[2]=3 - 在这种情况下,它会在地图中查找键2,如果找不到键,则会在地图中插入3。
  3. 我看到这个运算符的声明看起来像:Mapped_T &operator[](const Key_T &);但是我没有得到的是,如果找不到密钥,我将不得不在Map中插入一个新元素但是在operator []的声明中功能我看不到任何地方传递的价值。那么重载运算符如何知道插入键的值是什么?

2 个答案:

答案 0 :(得分:4)

当密钥不存在时,std::map使用值类的默认构造函数构造一个新值,并返回对新插入值的引用。

答案 1 :(得分:3)

它会被初始化 - 就像使用{}一样,这里有一些伪代码:

Mapped_T & operator[](const Key_T &k) {
    if(!has_key(k))
        insert(k, Mapped_T{});
    return at(k);
}

您问题的重要部分是Mapped_T{}。对于聚合,它意味着零初始化,对于具有默认构造函数的类,它意味着使用该构造函数。

相关问题