std::vector<int> v1(1000);
std::vector<std::vector<int>> v2(1000);
std::vector<std::vector<int>::const_iterator> v3(1000);
Run Code Online (Sandbox Code Playgroud)
如何初始化这3个向量的元素?
关于int,我测试它,我看到所有元素都变成0.这是标准吗?我相信原语仍未定义.我创建一个包含300000000个元素的向量,给出非零值,删除它并重新创建它,以避免操作系统内存清除数据安全.重建矢量的元素也是0.
迭代器怎么样?默认构造函数是初始值(0)还是初始值仍未定义?当我检查这个时,迭代器指向0,但这可能是操作系统
当我创建一个特殊的对象来跟踪构造函数时,我看到对于第一个对象,vector运行默认构造函数,而对于所有其他对象,它运行复制构造函数.这是标准吗?
有没有办法完全避免元素的初始化?或者我必须创建自己的矢量?(哦,我的上帝,我总是说不是另一个矢量实现)我问,因为我使用超大的稀疏矩阵并行处理,所以我不能使用push_back(),当然我不想无用的初始化,后来我会改变值.
Att*_*ila 13
您正在使用此构造函数(for std::vector<>):
explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator());
Run Code Online (Sandbox Code Playgroud)
其中包含以下文档:
重复序列构造函数:初始化向量,其内容设置为重复
n次数,副本的次数value.
由于您未指定value它采用参数的默认值T()(int在您的情况下),因此所有元素都将为 0
它们是默认初始化的.
关于int,我测试它,我看到所有元素都变成0.这是标准吗?我相信原语仍未定义.
不,未初始化 int具有不确定的价值.这些都是默认初始化的,即
int i; // uninitialized, indeterminate value
int k = int(); // default initialized, value == 0
Run Code Online (Sandbox Code Playgroud)
在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).该值初始化每个元素.