为什么不能访问vector :: reserve分配的内存

时间:2015-04-29 19:34:27

标签: c++

非常简单的问题,但为什么在你打电话时

std::vector<int> vec;
vec.reserve(100);
vec[89] = 99; // vector subscript out of range.-

您不能访问向量的0-99元素?考虑到保留向量的增加容量(分配了那个大小的新数组)并且你应该能够访问那些元素,即使它们是空的或者为空而无法启动,这没有多大意义。

据我所知,如果你这样做:

std::vector<int> vec(99, 0);
vec[89] = 99;

您将被允许访问元素,因为它们将被初始化为0,但是,除了最初通过构造函数之外,您不能使用此类默认值多次调整向量。

使用数组,可以做到:

int[] arr = new int[100];
arr[89] = 99;

当然,您必须自己编写调整大小。

arr1 = new int[200]
memcpy (arr1, arr, 100);
arr = arr1;
arr[90] = 100;

有没有办法像std::vector一样处理一旦达到某个容量后自己调整大小的数组?

1 个答案:

答案 0 :(得分:3)

如果您使用insertpush_back以及其他此类函数, 就像在达到特定容量时自行调整大小的数组一样。

您抱怨vec.reserve(100);,因为它会调用所有构造函数,然后暗示您希望它像int[] arr = new int[100];一样工作,但您似乎忽略了new int 调用所有析构函数。他们在这里做同样的事情。

  

除了最初通过构造函数之外,你不能使用这样的默认值多次调整一个向量

vector::resize调整数组大小,默认构造任何新数组。如果你想&#34;重置&#34;现有的,只需使用std::fill

vector::reserve的目的是让insertpush_back不进行不必要的重新分配。这是一个巧妙的技巧,原始数组不容易复制。这是额外的功能,而不是缺少功能。