标题说明或多或少。当我需要(为了这个例子)整数数组用于未知数量的值时,我知道我可以使用new *array = new int[size]
来改变它的大小。现在我的问题是:如果我有一个特定大小的数组,但我需要将其扩大,我可以使用new运算符来扩展它并且它是否仍然具有所有先前存储的元素,或者它是否更聪明地创建一个具有动态大小的全新数组,将前一个数组中的所有元素复制到新数组中,并将旧数组复制delete[]
。基本上只需在两个数组之间交换,每当我需要新的大小时。
具体来说,我在问这段代码是否会按照预期的方式工作
for(int i = 1; i < 10; i++){
int *array = new int[i];
array[i-1] = i;
}
我的假设是这个数组首先是1的大小,并将值1保存在索引0.然后它将其大小重新分配为2并将值存储到索引1,依此类推,直到i为9。 / p>
我想更好地重新解释一下我的问题:使用new初始化的数组是否必须填充元素,还是在使用运算符之前复制它所拥有的元素?
答案 0 :(得分:2)
您无法以这种方式调整阵列大小。您需要创建一个新数组,然后将旧数组复制到其中。您也可以尝试使用std :: vector,它会自动执行您想要的操作。
如果你想使用指针而不是std :: vector来改变数组的大小,你可以这样做。
int n = 100; // This will be the number of elements.
int *array1; // Pointer
array1 = new int[n]; // This will allocate your array with size n, so you will have 100 elements. You can combine this with the previous in int *array1 = new int[n];
所以请填写这个阵列但是请你...... 然后你决定要一个200元素的数组呢?您需要以相同的方式创建不同的数组。
int *array2 = new int[200];
您可以使用for循环将数组1复制到数组2.for循环应该迭代与数组1(100)中的元素一样多次。
for(int i = 0; i < 100; ++i)
array2[i] = array[1];
在这个阶段,array2与array1完全相同,但是从[100]到[199]可以使用100个未初始化的元素。
您将不再需要array1,所以在某些时候,您应该调用
delete [] array1;
顺便说一句,你的假设是行不通的,因为在循环的第一个循环中,你创建(或尝试创建)一个i = 1元素的数组。数组从0开始计数,因此您唯一的单个元素是[0]。当我在0时,i-1是什么?
如果您尝试访问数组[-1],您可能会崩溃。但是你为什么要创建10个不同的数组呢? new关键字创建一个不相关的对象,而不是覆盖具有相同名称的对象。
答案 1 :(得分:1)
使用
new
初始化的数组是否必须填充元素,还是在使用运算符之前复制它所拥有的元素?
new[]
分配新数组,完全独立于以前的数组。
我知道3种方法可以使阵列更大&#34;:
std::vector
。std::move
元素从旧数组生成到新数组,然后然后 delete[]
旧数组。new[]
&amp; delete[]
{}使用旧的realloc
和malloc
&amp; free
。答案 2 :(得分:0)
您必须分配新数组并将旧数组的数据复制到该数组中。这就是矢量的实现方式。如果有更好的方法,C ++标准社区会考虑这一点。