动态分配2D数组而不使用任何循环?

我们可以动态分配2D数组而不使用任何for循环或while循环吗? 我在c c ++中有任何直接命令或function吗?

如果不使用循环,您将在ISO c ++中有一个限制,即必须在编译时确定一个维度的大小。 然后,这个分配可以在一个语句中完成,如下所示:

#define COLUMN_SIZE 10 // this has to be determined at compile time int main() { int (* arr)[COLUMN_SIZE]; int rows = 20; // this is dynamic and can be input from user at run time arr = new int[rows][COLUMN_SIZE]; arr[3][4] = 10; cout << arr[3][4] << endl; return 0; } 

分配有内存的内存需要被释放。 此外,如果我们将其扩展到n维,则只能在运行时确定这些维度中的一个原因是编译器必须知道每行的大小才能创建一行连续的内存

虽然你应该避免原始指针,这应该工作 – >

 int *myArray = new int[R*C]; 

这里R是行数,C是列数。 虽然它实际上是一维数组,但您可以将其作为二维数组进行操作。 例如, myArray[i][j]可以读作 – >

 myArray[i*C + j] 

使用out循环执行此操作的唯一方法是分配psuedo 2D数组,从而:

 int *ary = new int[sizeX * sizeY]; 

但后来访问这是非标准和坦率丑陋:

 ary[y*sizeX + x] 

如果你想要一个“真正的”2Darrays,那么你就会陷入循环初始化:

 int **ary = new int*[sizeY]; for(int i = 0; i < sizeY; ++i) { ary[i] = new int[sizeX]; } 

但是你必须小心清理:

 for(int i = 0; i < sizeY; ++i) { delete [] ary[i]; } delete [] ary; 

所以在我看来

 std::vector > 

在现实世界的应用程序中,这可能是最简单,最安全的方式。

以arr [..] [..]格式访问的替代方法。

 #include  #include  #include  int main() { int COL ; int ROW ; COL = 8; ROW = 12; int (*p)[COL]; int *mem = (int*)malloc(sizeof(int)*COL*ROW); memset(mem,0,sizeof(int)*COL*ROW); p = (int (*)[10])mem; printf("0x%p\n", p); printf("0x%p %d\n", p+1, (((int)(p+1))-((int)p))/sizeof(int)); mem[2*COL+0] = 1; printf("%d\n", p[2][0]); mem[2*COL+5] = 2; printf("%d\n", p[2][5]); mem[6*COL+7] = 3; printf("%d\n", p[6][7]); p[1][2] = 4; printf("%d\n", mem[1*COL+2]); free(p); return 0; } 

当然,你可以做int (*p)[COL] = (int (*)[COL]) malloc(sizeof(int)*COL*ROW); 直。

std::map >可能是动态分配的选择来表示2D数组。

 #include  typedef std::map > array2dstring; int main(int argc, char *argv[]) { array2dstring l_myarray2d; l_myarray2d[10][20] = "Anything"; } 

尝试通过递归替换循环