4

让我们说,我们使用std::vector<int>or std::vector<long>。随着向量大小的增长,新分配的元素会默认初始化为 0,还是程序员需要显式地将它们初始化为 0?

4

3 回答 3

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意味着

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

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

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

于 2013-02-15T13:09:59.970 回答
6

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

void resize(size_type sz);

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

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

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

— 如果 T 是具有用户提供的构造函数(12.1)的(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

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

— 如果 T 是一个数组类型,那么每个元素都是值初始化的;

否则,对象是零初始化的

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

于 2013-02-15T13:09:57.417 回答
4

是的,当std::vector改变大小时(也许通过做std::vector::resize),任何新元素都将被初始化。对于诸如intor之类的类型long,值初始化会导致零初始化,顾名思义,零初始化会将值设置为 0。

于 2013-02-15T13:10:07.707 回答