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

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

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

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

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

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

4

4 回答 4

13

您正在使用此构造函数(for std::vector<>):

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

其中有以下文档

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

由于您没有指定,value它采用参数的默认值,T()int您的情况下,所以所有元素都将为0

于 2012-06-05T22:39:16.067 回答
5

它们是默认初始化的。

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

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

int i;          // uninitialized, indeterminate value
int k = int();  // default initialized, value == 0
于 2012-06-05T22:37:10.710 回答
5

在 C++11 中,构造函数的规范vector::vector(size_type n)n元素是默认插入的。这被定义为由表达式初始化的元素allocator_traits<Allocator>::construct(m, p)(其中m是分配器类型和p指向存储在容器中的类型的指针)。对于默认分配器,此表达式为::new (static_cast<void*>(p)) T()(请参阅参考资料20.6.8.2)。此值初始化每个元素。

于 2012-06-05T22:46:43.897 回答
3

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

于 2012-06-05T22:35:48.557 回答