我们可以动态分配2D数组而不使用任何for循环或while循环吗? 我在c c ++中有任何直接命令或函数吗?
答案 0 :(得分:3)
如果不使用循环,您将在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;
}
需要释放分配有 new 的内存。此外,如果我们将其扩展到n维,则只能在运行时确定这些维度中的一个。 原因是编译器必须知道每行的大小才能创建一行连续的内存。
答案 1 :(得分:1)
虽然你应该避免使用原始指针,但这应该可以 - >
int *myArray = new int[R*C];
这里R是行数,C是列数。虽然它实际上是一维数组,但您可以将其作为二维数组进行操作。例如,myArray[i][j]
可以读作&gt;
myArray[i*C + j]
答案 2 :(得分:0)
使用out循环执行此操作的唯一方法是分配psuedo 2D数组:
int *ary = new int[sizeX * sizeY];
然后访问非标准&amp;坦率地说,丑陋:
ary[y*sizeX + x]
如果你想要一个“真正的”2D阵列,那么你就会陷入循环初始化:
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<std::vector < int> >
可能是真实世界应用中最简单,最安全的方式。
答案 3 :(得分:0)
以arr [..] [..]格式访问的替代方式。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
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);
。
答案 4 :(得分:-1)
尝试通过递归替换循环
答案 5 :(得分:-1)
std::map<TypeDim1, std::map<TypeDim2, TypeContent> >
可能是动态分配的选择来表示2D数组。
#include <map>
typedef std::map<int, std::map<int, std::string> > array2dstring;
int main(int argc, char *argv[])
{
array2dstring l_myarray2d;
l_myarray2d[10][20] = "Anything";
}