我正在尝试实现一个函数,它可以将任何数据类型的动态数组的大小增加一个,使数组保留所有数据的现有数据。
我想这样做,因为我们经常需要在课堂上为实际项目使用和调整动态数组的大小,所以尽我所能,我不能使用向量。
我首先想知道是否可以这样做,如果有的话,有人可以告诉我如何做。
这是我到目前为止所做的。
template <typename Temp>
void incArraySize(Temp * dynamicArray, int i_Elements)
{
Temp * dummyArr = new Temp [i_Elements];
for (int l = 0; l < i_Elements; l++)
dummyArr[l] = dynamicArray[l];
delete [] dynamicArray;
dynamicArray = new Temp [i_Elements+1];
for (int l = 0; l < i_Elements; l++)
dynamicArray[l] = dummyArr[l];
delete [] dummyArr;
}
这在第一次调用函数时工作正常,但后来我得到了访问冲突。
答案 0 :(得分:1)
dynamicArray
应该通过引用传递,
void incArraySize(Temp*& dynamicArray, int i_Elements)
否则行dynamicArray = new Temp [i_Elements+1];
中的重新绑定将不会在函数外部应用。
也就是说,当你打电话
int* array = new int[10];
incArraySize(array, 10);
// line 3:
std::cout << array[0];
在第3行,数组已被incArraySize
删除[],但array
变量仍然指向这个旧的已删除数组。这就是您获得访问冲突的原因。
您是否考虑过std::vector<Temp>
?标准库类型可以为您正确管理内存和大小,并且更易于使用。
答案 1 :(得分:1)
将数组的大小增加一个将是非常低效的,特别是如果您需要多次执行此操作。我建议牺牲一些内存并使用比你需要的更多的空间,或者使用一个你可以使用.push()方法的列表
在您当前的方法中,看起来您正在复制指向新数组的指针,而不是将各个值从虚拟数组复制到动态数组,尝试在for循环中使用new关键字以确保每个都传递数据你复制它的时间
答案 2 :(得分:1)
为什么要两份?正如KennyTM所说,你需要一个参考:
template <typename Temp>
void incArraySize(Temp *& dynamicArray, int i_Elements)
{
Temp * p = new Temp[i_Elements + 1];
for (int l = 0; l < i_Elements; l++)
p[l] = dynamicArray[l];
delete [] dynamicArray;
dynamicArray = p;
}