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;
}
}
所以我定义指针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;
}
}