std :: vector elements初始化

时间:2012-06-05 22:33:17

标签: c++ vector

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,但这可能是OS

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

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

4 个答案:

答案 0 :(得分:13)

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

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

其中包含以下documentation

  

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

由于您未指定value,因此参数的默认值为T(),在您的情况下为int,因此所有元素都将是0

答案 1 :(得分:5)

它们是默认初始化的。

  

关于int,我测试它,我看到所有元素都变成0.这是标准吗?我相信原语仍未定义。

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

int i;          // uninitialized, indeterminate value
int k = int();  // default initialized, value == 0

答案 2 :(得分: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)。该值初​​始化每个元素。

答案 3 :(得分:3)

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