1

我们可以在不使用任何 for 循环或 while 循环的情况下动态分配二维数组吗?我在c c++中有任何直接命令或函数吗?

4

6 回答 6

4

如果不使用循环,您将在 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 个维度,则在运行时只能确定其中一个维度。原因是编译器必须知道每一行的大小才能创建一行连续的内存

于 2012-09-28T07:17:40.157 回答
1

尽管您应该避免使用原始指针,但这应该可以工作->

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

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

myArray[i*C + j]
于 2012-09-28T07:04:33.590 回答
0

使用 out 循环的唯一方法是分配一个伪 2D 数组,因此:

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

但随后访问它是非标准的,坦率地说很难看:

ary[y*sizeX + x]

如果您想要一个“真实的”二维数组,那么您将陷入循环初始化:

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> >  

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

于 2012-09-28T07:17:23.333 回答
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);直接做。

于 2012-09-28T08:20:26.270 回答
-1

尝试通过递归替换循环

于 2012-09-28T06:59:31.020 回答
-1

Astd::map<TypeDim1, std::map<TypeDim2, TypeContent> >可能是一个动态分配的选择来表示一个二维数组。

#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"; 
}
于 2012-09-28T07:06:59.767 回答