将二维阵列模拟为一维阵列

Simulate 2D array to 1D

本文关键字:阵列 模拟 一维 二维      更新时间:2023-10-16

我有一个锯齿状的2D数组,行的长度不完全相同:

int sizes[100];
//init sizes
unsigned char *p = [100];
for(unsigned int i = 0; i < 10; i++)
{
p[i] = (unsigned char*)malloc(sizeof(char)*sizes[i]);
for(unsigned int j = 0; j < sizes[i]; j++)
p[i] = j;
}

我使用这样的数组:

p[x][y]

如何将此数组模拟为1D?

我假设,如果您想将"2D数组"作为一个一维矩阵访问,那么当您将索引增加1时,您将访问数组中的下一个元素(当您离开边缘时,将自动转到下一行)。正确的方法是更改分配数组的方式。我将尝试展示这是如何做到的——这只是C,而不是C++。它可能更合适,因为您无论如何都在使用malloc。我还认为您的代码中有一个相当严重的错误,因为您正在创建一个char *指针p,但希望在中使用它

p[x][y];

显然,您需要一个char **。让我们试着制作出你想要的代码:

int sizes[100];
//init sizes
unsigned char *p[100];  // without the == sign we create an array of 100 pointers
unsigned char *bigP;   // the master pointer
int totalLength = 0;
int ii;
for(ii=0; ii<100; ii++) totalLength += sizes[ii];
bigP = malloc(sizeof(char) * totalLength);
int offset = 0;
// make pointers p point to places along this big memory block:
for(ii = 0; ii < 100; ii++) {
p[ii] = bigP + offset;
offset += sizes[ii];
}

现在,您可以使用寻址您的阵列

p[x][y];

或使用

bigP[z];

其中CCD_ 5可以从0到元素的最大数量。当然,在这个过程中,你不知道(当你使用"1D"范式时)你在锯齿状阵列的哪一行/哪一列——如果你真的在一维,你就不知道。

这里的关键是,内存被分配为单个连续块,指针p指向该块中的位置。这意味着您不得释放p。您必须只释放bigP

我希望这是有道理的。

如果您正在寻找将二维数组映射到一维空间的方法,请尝试。。。

int sizes[width*height];
void setPoint(int x, int y, int val) {
sizes[x*width + y] = val;
}

值得注意的是,x*width + y索引将在一维数组中为您提供适当的元素。

除非是家庭作业,否则只需下载boost并使用boost.Matry.