Подобно тому, как дом я сказал (но неindex1=y*m+x
а index1=x*n+y
эмулировать нужную запись):
int *array = new int [m*n];
int get (int x, int y) // emulates array[x][y] for array[m][n]
{
return array[x*n+y];
}
Однако, я думаю, что реальное 2-мерное распределение (как Влад из Москвы показал вам) медленнее в создании (и потребности немного больше памяти), но быстрее в доступе. Причина array[x*n+y] == *(array+x*n+y)
, wether array[x][y] == *(*(array+x)+y)
, поэтому у вас есть одно умножение меньше, но одно разделение больше, в сумме Я думаю, это быстрее.
Вы также можете создать класс:
class array2d
{
private:
int *data;
int mm, nn;
public:
array2d (int m, int n)
{
mm = m;
nn = n;
data = new int [m*n];
}
~array2d()
{
delete[] data;
}
int *operator[] (int x)
{
return (data+x*nn);
}
};
С его помощью вы можете использовать
array2d arr(10,10);
arr[5][7] = 1;
Вы не пытаетесь * объявить * динамический массив (который на самом деле незаконным в C++, все массивы должны быть фиксированного размера). Вы пытаетесь * выделить * динамический массив. – john