调整任何动态数组大小的函数

时间:2013-06-19 20:26:46

标签: c++ arrays function dynamic

我正在尝试实现一个函数,它可以将任何数据类型的动态数组的大小增加一个,使数组保留所有数据的现有数据。

我想这样做,因为我们经常需要在课堂上为实际项目使用和调整动态数组的大小,所以尽我所能,我不能使用向量。

我首先想知道是否可以这样做,如果有的话,有人可以告诉我如何做。

这是我到目前为止所做的。

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;
}

这在第一次调用函数时工作正常,但后来我得到了访问冲突。

3 个答案:

答案 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;

}