【问题标题】:A function to resize any dynamic array调整任何动态数组大小的函数
【发布时间】:2013-06-16 13:01:58
【问题描述】:

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

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

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

这是我目前所拥有的。

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

第一次调用该函数时可以正常工作,但随后会出现访问冲突。

【问题讨论】:

    标签: c++ arrays function dynamic


    【解决方案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&lt;Temp&gt;?标准库类型可以为您正确管理内存和大小,并且更易于使用。

    【讨论】:

    • 非常感谢。我自己永远不会得到这个。我想我还有一些关于指针和引用的研究要做,因为这些主题对我来说仍然有点模糊。
    【解决方案2】:

    将数组的大小增加一将非常低效,尤其是在您需要多次执行此操作时。我建议牺牲一些内存并使用比您需要的更多的空间,或者使用可以使用 .push() 方法的列表

    在您当前的方法中,您似乎正在复制指向新数组的指针,而不是将单个值从虚拟数组复制到动态数组,请尝试在 for 循环中使用 new 关键字,以确保每个都传递数据你把它复制过来的时间

    【讨论】:

      【解决方案3】:

      为什么要两份?正如 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;
      
      }
      

      【讨论】:

        猜你喜欢
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        相关资源
        最近更新 更多