新分配的std :: vector <int>元素是否初始化为0?</int>

时间:2013-02-15 13:06:24

标签: c++ vector stl

我们说,我们使用std::vector<int>std::vector<long>。随着向量的大小增加,默认情况下新分配的元素是否会被初始化为0,或者程序员是否需要明确地将它们归为0?

3 个答案:

答案 0 :(得分:10)

新的元素是值初始化的:

  

[C++11: 23.3.6.3/9]: void resize(size_type sz);

  效果sz <= size(),相当于erase(begin() + sz, end());。如果size() < sz,请将sz - size() 值初始化的元素附加到序列中。

对于intlong,这意味着0

  

[C++11: 8.5/7]: 要对T类型的对象进行值初始化,意味着

     
      
  • 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(并且初始化为如果T没有可访问的默认构造函数,则格式错误;
  •   
  • 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T隐式声明的默认值构造函数是非平凡的,该构造函数被调用。
  •   
  • 如果T是数组类型,则每个元素都是值初始化的;
  •   
  • 否则,该对象为零初始化。
  •   
     

值初始化的对象被视为构造,因此受本国际标准的规定适用于“构造”对象,“构造函数已完成的对象”等,即使没有调用构造函数也是如此用于对象的初始化。

请注意,这是谈论向量末尾的“保留”空间。此空间不包含任何有效元素,零 - 初始化或以其他方式。这个答案和标准措辞只讨论了在执行resize而没有为新元素指定显式值时获得的元素。

答案 1 :(得分:6)

根据C ++ 11标准的第23.3.6.3/9段(约std::vector::resize()):

  

void resize(size_type sz);

     

效果:如果sz&lt; = size(),相当于erase(begin()+ sz,end());.如果size()&lt; sz,将sz - size()值初始化元素附加到序列中。

此外,根据标准第8.5 / 7段:

  

值初始化,T类型的对象意味着:

     

- 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),那么   调用T的默认构造函数(如果T没有可访问的默认值,则初始化是错误的   构造函数);

     

- 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象   是零初始化,如果T的隐式声明的默认构造函数是非平凡的,那么构造函数是   调用。

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,该对象为零初始化

这意味着在int的情况下,新创建的元素的值已初始化为0

答案 2 :(得分:4)

是的,当std::vector更改大小(可能通过执行std::vector::resize)时,任何新元素都将值初始化。对于诸如intlong之类的类型,值初始化会导致零初始化,顾名思义,它会将值设置为0.