以下std :: vector代码是否有效?

时间:2010-03-05 02:15:25

标签: c++ stdvector

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?

以上代码是否安全?

5 个答案:

答案 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算法。