是否初始化了std :: map中原始类型的值?

时间:2016-07-24 05:33:13

标签: c++ primitive-types stdmap

请考虑以下代码:

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

我认为打印出来的值是未定义的,因为原始类型没有默认构造函数,但是每次测试时我都得到10000个。

为什么要初始化?

4 个答案:

答案 0 :(得分:13)

当调用operator[]且缺少密钥时,使用表达式mapped_type()初始化该值,该表达式是类类型的默认构造函数,而整数类型的初始化为零。

答案 1 :(得分:5)

如果

std::map::operator[]不存在,则会插入新值。如果执行插入,则默认构造函数对类类型初始化映射值,否则为zero-initialized初始化。

答案 2 :(得分:3)

请参阅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为intint()为0

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

另外:

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

答案 3 :(得分:0)

在C ++ 14标准中,[map.access]部分的文字是:

  

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

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

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

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

对于此问题中的int,值初始化意味着int设置为0