我们说,我们使用std::vector<int>
或std::vector<long>
。随着向量的大小增加,默认情况下新分配的元素是否会被初始化为0,或者程序员是否需要明确地将它们归为0?
答案 0 :(得分:10)
新的元素是值初始化的:
[C++11: 23.3.6.3/9]:
void resize(size_type sz);
效果:sz <= size()
,相当于erase(begin() + sz, end());
。如果size() < sz
,请将sz - size()
值初始化的元素附加到序列中。
对于int
和long
,这意味着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
)时,任何新元素都将值初始化。对于诸如int
或long
之类的类型,值初始化会导致零初始化,顾名思义,它会将值设置为0.