代码之家  ›  专栏  ›  技术社区  ›  Leo Lai

std::map中的基元类型值是否已初始化?

  •  11
  • Leo Lai  · 技术社区  · 8 年前

    考虑以下代码:

    map<int,int> m;
    for(int i=0;i<10000;++i) m[i]++;
    for(int i=0;i<10000;++i) printf("%d",m[i]);
    

    为什么要初始化它?

    4 回复  |  直到 8 年前
        1
  •  13
  •   Joseph Garvin    8 年前

    调用时 operator[] mapped_type() 它是类类型的默认构造函数,是整型的零初始化。

        2
  •  5
  •   Nikita    8 年前

    std::map::operator[] 如果不存在,则插入新值。如果执行插入,映射值将由类类型或 zero-initialized 否则

        3
  •  3
  •   kaitian521    8 年前

    https://www.sgi.com/tech/stl/stl_map.h

      _Tp& operator[](const key_type& __k) {
        iterator __i = lower_bound(__k);
        // __i->first is greater than or equivalent to __k.
        if (__i == end() || key_comp()(__k, (*__i).first))
          __i = insert(__i, value_type(__k, _Tp()));
        return (*__i).second;
      }
    

    在您的示例中,_Tp是 int int() 是0

    #include <iostream>
    using namespace std;
    int main() {
      int x = int();
      cout << x << endl;
      return 0;
    }
    

    此外:

    感谢@MSalters,他告诉我们上面的代码是SGI而不是std::map,但我认为这有点像。。。

        4
  •  0
  •   M.M    8 年前

    在C++14标准中,第节 [map.access] 文本是:

    T& operator[](const key_type& x);

    1. 效果:如果没有等价于的键 x 在地图中,插入 value_type(x, T()) 到地图中。

    因此,正如Joseph Garvin的回答所述,表达式的结果 mapped_type() 是插入的内容。这种初始化称为 value-initialization .

    对于类类型,值初始化的含义并不像其他答案中提供的那样简单。正如cppreference链接所解释的那样,这取决于类类型具有何种类型的构造函数,以及类是否是聚合。

    int 在这个问题中,值初始化意味着 整数 设置为 0 .