代码之家  ›  专栏  ›  技术社区  ›  user331471

STD::映射运算符[]并自动创建新对象

  •  1
  • user331471  · 技术社区  · 14 年前

    我有点害怕这样的事情:

    std::map<DWORD, DWORD> tmap;
      tmap[0]+=1;
      tmap[0]+=1;
      tmap[0]+=1;
    

    由于dword不是自动初始化的,所以我总是担心tmap[0]是一个递增的随机数。如果运行时不知道如何初始化DWORD,映射如何知道如何初始化DWORD?

    有保证吗,结果总是 tmap[0] == 3 ?

    3 回复  |  直到 14 年前
        1
  •  3
  •   AnT stands with Russia    14 年前

    新对象,当通过 [] 接线员,是 值已初始化 . 它是由map实现来保证的,即在这个意义上它是“自动”完成的。对于类型的对象 DWORD (假设它是标量类型),值初始化意味着零初始化。

    根据23.3.1.2中给出的定义, operator []

    (*((insert(make_pair(x, T()))).first)).second
    

    这个 T() 位是新对象,它将变成 DWORD() 对你来说。 德沃德() 保证为零。

        2
  •  4
  •   CB Bailey    14 年前

    对。将新值插入地图时 operator[] 它是 值已初始化 对于内置的数字类型( DWORD 是内置类型的typedef)这意味着零。

        3
  •  0
  •   Naveen    14 年前

    对.如果你把钥匙交给 operator[] 不存在,则地图将 默认构造 对象并将其插入。如果是你的话就行了 DWORD() 它将产生一个值0。