C++ 向量元素初始化 标准:向量v1(1000); std::矢量v2(1000); std::vectorv3(1000);

C++ 向量元素初始化 标准:向量v1(1000); std::矢量v2(1000); std::vectorv3(1000);,c++,vector,C++,Vector,这3个向量的元素是如何初始化的 关于int,我测试了它,发现所有元素都变成了0。这是标准吗?我相信原语仍然没有定义。我创建了一个包含300000000个元素的向量,给出了非零值,删除它并重新创建它,以避免操作系统内存被清除,从而保证数据安全。重新创建的向量的元素也为0 迭代器呢?默认构造函数是否有初始值(0)或初始值未定义?当我检查这个时,迭代器指向0,但这可以是OS 当我创建一个特殊的对象来跟踪构造函数时,我看到对于第一个对象,vector运行默认构造函数,对于所有其他对象,它运行复制构造函数

这3个向量的元素是如何初始化的

关于int,我测试了它,发现所有元素都变成了0。这是标准吗?我相信原语仍然没有定义。我创建了一个包含300000000个元素的向量,给出了非零值,删除它并重新创建它,以避免操作系统内存被清除,从而保证数据安全。重新创建的向量的元素也为0

迭代器呢?默认构造函数是否有初始值(0)或初始值未定义?当我检查这个时,迭代器指向0,但这可以是OS

当我创建一个特殊的对象来跟踪构造函数时,我看到对于第一个对象,vector运行默认构造函数,对于所有其他对象,它运行复制构造函数。这是标准吗

有没有办法完全避免初始化元素?或者我必须创建自己的向量?(哦,我的天,我总是说不要另一个向量实现)
我问这个问题是因为我使用超大稀疏矩阵进行并行处理,所以我不能使用push_back(),当然我也不想要无用的初始化,稍后我会更改值。

向量的元素是默认初始化的,在POD类型的情况下,这意味着零初始化。使用标准向量无法避免它。

它们是默认初始化的

关于int,我测试了它,发现所有元素都变成了0。这是标准吗?我相信原语仍然没有定义

否,未初始化的
int
具有不确定的值。这些是默认初始化的,即

std::vector<int> v1(1000);
std::vector<std::vector<int>> v2(1000);
std::vector<std::vector<int>::const_iterator> v3(1000);

您正在使用此构造函数(对于
std::vector
):

其中包括:

重复序列构造函数:将向量的内容设置为重复
n次
value
的副本来初始化向量


由于您没有指定
,因此它采用参数的默认值,
T()
,在您的例子中是
int
,因此在C++11中,所有元素都将是0

,构造函数的规范
vector::vector(size\u type n)
说明
n
元素是默认插入的。这被定义为一个由表达式
allocator\u traits::construct(m,p)
初始化的元素(其中
m
是分配器类型,
p
是指向存储在容器中的类型的指针)。对于默认分配器,此表达式是
::new(static_cast(p))T()
(请参见
20.6.8.2
)。这个值初始化每个元素。

它们不是默认初始化的,而是值初始化的。@ildjarn,我知道我会搞砸的。我永远无法保持这些初始化风格。我这方面也搞砸了。C++的语义仍然不时地逃脱我,我每天使用这个语言…我相信C++ 11将这个改变为<代码> n默认初始化值,而不是一个默认初始化,后面是多个副本。@ AtTia见我对C++引用的答案11.是的C++ 11将它改为n个默认构造函数。确认。
int i;          // uninitialized, indeterminate value
int k = int();  // default initialized, value == 0
explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator());