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(),当然我不想无用的初始化,以后我会改变值。
答案 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类型的情况下,初始化为零。使用标准向量无法避免它。