【问题标题】:function to double size of array arbitrary number of times?函数将数组的大小加倍任意次数?
【发布时间】:2017-11-03 18:29:31
【问题描述】:

我试图让这个函数创建一个新数组,使其大小为数组参数的 2 倍,将内容复制到新数组中,对于数组的后半部分,通过执行 2*the values 创建新值在数组的前半部分,然后删除原始数组。重复此过程指定的次数,然后返回新数组。我觉得我的算法正确,但我的代码不起作用。请帮忙!

int *ArrayDynamicAllocation(int array[], int size, int number)
{
    int *new_array = NULL;

    for(int i=0; i<number-1; i++)
    {
        new_array = new int[size*2];
        for(int j=0; j<size-1; j++)
        {
            new_array[j]=array[j];
            new_array[j+size]=2*array[j];
        }
        array=new_array;
        delete[] array;
        size=size*2;     
    }
    return new_array;
}

一个示例输出是如果我要放入我的函数的信息是 int arr[2] = {0,1}; 数组大小 = 2; 数字 = 3; 我希望它输出 0 1 0 2 0 2 0 4 0 2 0 4 0 4 0 8

【问题讨论】:

  • Off-by-onesize-1 应该是 sizenumber-1 应该是 number
  • array=new_array; delete[] array; 我认为这不会很好地结束,无论是您的下一次迭代还是您的最终返回值。很确定你想要那些线 reversed

标签: c++ arrays


【解决方案1】:
int *ArrayDynamicAllocation(int array[], int size, int number)
{
   int *new_array = NULL;
   int *tmp_array = new int[array.length()];
   for(int k=0; k<array.length(); k++)//Initial array copying.
       tmp_array[k] = array[k];

   for(int i=0; i<number; i++)//Array range 0 to n-1
   {
      new_array = new int[size*2];
      for(int j=0; j<size; j++)//Array range 0 to n-1
      {
         new_array[j]=tmp_array[j];
         new_array[j+size]=2*tmp_array[j];
      }
      delete[] tmp_array //Deleting old array
      size=size*2; 
      tmp_array = new int[size] //Allocating memory for next iteration
      for(int k=0; k<size; k++)
        tmp_array[k] = new_array[k];//Copying array for next iteration
  }
  delete[] tmp_array;// To free memory
  return new_array;
};

【讨论】:

  • 非常感谢!如果数组为[0],我该如何处理?
  • 如果 array.length()>0 执行所有其他操作返回与输出相同的输入数组,您可以在第一行中验证这一点。
  • @walshjm :: 如果对您有帮助,请将其标记为答案。
【解决方案2】:

c 数组范围从 0 到 size-1
改变

for(int i=0; i<number-1; i++)

for(int i=0; i<=number-1; i++)

改变

for(int j=0; j<size-1; j++)

for(int j=0; j<=size-1; j++)

你删除了错误的数组
改变

array=new_array;
delete[] array;

delete[] array;
array=new_array;

【讨论】:

    【解决方案3】:
     template<class T>
     void changeSize1d(T*&a, const int oldSize, const int newSize){
     if(newSize<0)return 0;
     T*temp new T[newSize];
     int number = min(oldSize, newSize);
     copy(a, a+number, temp);
     delete [] a;
     a = temp;
    }
    

    【讨论】:

    • 您能否详细说明为什么您认为这是正确答案?
    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 2022-11-23
    • 2021-01-08
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多