std::vector<Foo> vec;
Foo foo(...);
assert(vec.size() == 0);
vec.reserve(100); // I've reserved 100 elems
vec[50] = foo; // but I haven't initialized any of them
// so am I assigning into uninitialized memory?
以上代码是否安全?
答案 0 :(得分:7)
无效。向量没有元素,因此您无法访问它们的任何元素。您只需为100
元素保留空间(这意味着它确保在插入超过100个元素之前不会重新分配)。
事实是你不能在不初始化元素的情况下调整矢量大小(即使只是默认初始化)。
答案 1 :(得分:4)
如果您想立即进行索引,则应使用vec.resize(100)
。
vec[50]
仅在50 < vec.size()
时才安全。 reserve()
不会更改向量的大小,但resize()
会执行和构建包含的类型。
答案 2 :(得分:0)
它无效。虽然容器保留了100个元素,但它仍然有0个元素。
您需要插入元素才能访问该部分内存。就像Jon-Eric所说,resize()
是要走的路。
答案 3 :(得分:0)
std :: vector :: reserve(100)将声明100 * sizeof(Foo)的空闲内存,因此在100 * sizeof(foo)已满之前,进一步插入向量将不会进行内存分配,该向量的元素将给出该元素的不确定内容,因为它只声称内存不会分配它。
答案 4 :(得分:0)
在使用operator []访问第50个元素之前,你应该调用resize,push_back()50次或者使用std :: fill_n算法。