std::vector<int> 上的调整大小是否将新元素设置为零?

P45*_*ent 4 c++ integer stdvector value-initialization c++11

考虑

#include <vector>
int main()
{
    std::vector<int> foo;
    foo.resize(10);
    // are the elements of foo zero?
}
Run Code Online (Sandbox Code Playgroud)

元素foo全为零吗?我认为它们是从 C++11 开始的。但想确切地知道。

use*_*570 7

元素foo全为零吗?

是的,这可以从std::vector::resize 文档中看出:

如果当前大小小于 count,

  1. 附加额外的默认插入元素

并来自defaultInsertable

默认情况下,这将调用 Placement-new,如::new((void*)p) T()(C++20 之前) std::construct_at(p)(C++20 起)(即,对指向的对象进行值初始化p)。如果不需要值初始化,例如,如果对象是非类类型并且不需要清零,则可以通过提供自定义Allocator::construct.

(强调我的)

请注意T()上面引用的声明中的内容。这意味着调整大小后foo.resize(10);, 的元素foo将包含初始化值0时的值。


小智 6

简单回答:是的

\n

长答案:

\n
\n

如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,\n以达到 n 的大小。如果指定了 val,则新元素将被初始化为\nval 的副本,否则,它们将被值初始化

\n
\n

现在,作为标准的值初始化,我们得到:

\n
\n

\xe2\x80\x94 如果 T 是具有用户声明的构造函数的类类型(第 9 条)\n(12.1),则调用 T 的默认构造函数(如果 T 没有可访问的,则初始化是格式错误的)默认\n构造函数); \xe2\x80\x94 如果 T 是没有用户声明的构造函数的非联合类类型,则 T 的每个非静态数据成员和基类组件都会进行值初始化;\xe2\x80\x94 如果 T 是数组类型,则\n每个元素都是值初始化的;\xe2\x80\x94 否则,该对象\n零初始化

\n
\n

int否则,它会被初始化为零

\n