c++中二维数组的动态分配

Dynamic allocation of 2D array in c++

所以我定义指针x指向n整数为:

int* x = new int [n];

x 的值循环变化。在循环结束时,我将指针 x 存储在已初始化为的二维指针 y 中:

int** y = new int* [n];

我使用下面的赋值表达式将指向x的指针存储在y[=的ith元素中44=]:

y[i] = x;

由于x指向内存的同一部分,但x中存储的值不断变化,二维数组中的所有元素y 将获取最后一次执行循环期间存储在 x 中的值。

我的问题:

我是否可以在每次将其地址存储在 [=25 中时,将 x 从它指向的位置取消链接并使其指向内存的新部分=]y?这样 y 将地址存储到内存的不同部分,因此可以检索存储在 x 中的答案的历史记录。另外请让我知道这种方法(如果可能的话)是否比通过循环在每次迭代中用 x 填充 y 的行更快在它的元素上。

至于什么更快,我不能说...我建议您尝试并设置每种方法的原型。至于重新链接x,你可以使用:

x = new int[n];

希望对您有所帮助。

如果我的理解是正确的,你想保留 y 中数组 x 的所有值的历史记录。

如果不在每次迭代中用 x 填充 y 的行,你的建议是不可能的。

你可以做的是预分配,这样你就不会在循环中有新的分配,你在循环之前就有了它(你仍然会做一个副本)。

内存成本仍然是 n^2,复杂度也是如此。

  // without preallocation
  {
     int** y = new int*[n];
     int* oldx=0;
     for (int i=0;i<n;i++)
     {
        int* x = new int[n];
        // migrate old values in case you are modifying just a part of x
        if (oldx!=0)
        {
            memcpy(x,oldx,n*sizeof(int));
        }
        //... do some stuff with x;
        y[i] = x;
        // keep reference to copy in next iteration
        oldx=x;
     }
  }

  // with preallocation
  {
     int ** y = new int*[n];
     // preallocate memory
     for (int i=0;i<n;i++)
     {
         y[i] = new int[n];
     }
     int* oldx=0;
     for (int i=0;i<n;i++)
     {

         int* x =y[i];
         // migrate old values in case you are modifying just a part of x
         if (oldx!=0)
         {
             memcpy(x,oldx,n-sizeof(int));
         }
         // ... do stuff with x
         // keep reference to copy in next iteration
         oldx = x;
     }
  }