Динамически выделить 2D-массив без использования каких-либо циклов?

Можем ли мы динамически распределить 2D-массив без использования циклов for или while?
Есть ли прямая команда или функция в C ++?

1

Решение

Без использования цикла у вас будет одно ограничение в 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 размеров, только один из этих размеров могут быть определены во время выполнения. Причина в том, что компилятор должен знать размер каждой строки, чтобы создать строку непрерывной памяти.

3

Другие решения

Хотя вы должны избегать сырых указателей, это должно работать->

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

Здесь R — количество строк, а C — количество столбцов. Хотя это действительно одномерный массив, вы можете управлять им как двумерным массивом. Например, myArray[i][j] можно читать как->

myArray[i*C + j]
1

Единственный способ сделать это без циклов — это выделить 2D-массив psuedo следующим образом:

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

но затем доступ к этому не является стандартным & откровенно некрасиво

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

это, пожалуй, самый простой и безопасный способ использования приложения в реальном мире.

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); непосредственно.

0

std::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";
}
-1

Попробуйте заменить цикл на рекурсию

-1