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?
上面的代码安全吗?
这是无效的。向量没有元素,因此您无法访问其中的任何元素。您只是为元素保留了空间100
(这意味着在插入超过 100 个元素之前,可以保证不会发生重新分配)。
事实是你不能在不初始化元素的情况下调整向量的大小(即使只是默认初始化)。
vec.resize(100)
如果你想立即索引,你应该使用。
vec[50]
只有当 时才是安全的50 < vec.size()
。reserve()
不会更改向量的大小,但resize()
会更改并构造包含的类型。
它行不通。虽然容器保留了 100 个元素,但它仍然有 0 个元素。
您需要插入元素才能访问那部分内存。就像 Jon-Eric 说的那样,resize()
这是要走的路。
std::vector::reserve(100) 将要求 100*sizeof(Foo) 的可用内存,因此在 100*sizeof(foo) 已满之前,进一步插入向量不会进行内存分配,但访问的元素该向量将给出该元素的不确定内容,因为它只要求内存不分配它。
在您可以使用 operator[] 访问第 50 个元素之前,您应该调用 resize、push_back() 50 次或使用 std::fill_n 算法。