4
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?

上面的代码安全吗?

4

5 回答 5

7

这是无效的。向量没有元素,因此您无法访问其中的任何元素。您只是为元素保留了空间100(这意味着在插入超过 100 个元素之前,可以保证不会发生重新分配)。

事实是你不能在不初始化元素的情况下调整向量的大小(即使只是默认初始化)。

于 2010-03-05T02:20:13.750 回答
4

vec.resize(100)如果你想立即索引,你应该使用。

vec[50]只有当 时才是安全的50 < vec.size()reserve()不会更改向量的大小,但resize()会更改构造包含的类型。

于 2010-03-05T02:22:51.297 回答
0

它行不通。虽然容器保留了 100 个元素,但它仍然有 0 个元素。

您需要插入元素才能访问那部分内存。就像 Jon-Eric 说的那样,resize()这是要走的路。

于 2010-03-05T02:20:28.230 回答
0

std::vector::reserve(100) 将要求 100*sizeof(Foo) 的可用内存,因此在 100*sizeof(foo) 已满之前,进一步插入向量不会进行内存分配,但访问的元素该向量将给出该元素的不确定内容,因为它只要求内存不分配它。

于 2010-03-05T02:32:42.830 回答
0

在您可以使用 operator[] 访问第 50 个元素之前,您应该调用 resize、push_back() 50 次或使用 std::fill_n 算法。

于 2010-03-05T03:53:45.590 回答