Есть еще кое-что, что я до сих пор не совсем понимаю, о том, как матрицы и другие многомерные массивы представлены в C и C + и как их динамически распределять.
Рассмотрим следующий сегмент кода:
int main()
{
int n;
cin >> n;
int a[n][n];
...
}
Если я правильно понимаю, это выделяет матрицу целых чисел n в n в стеке.К (i, j) -ому элементу матрицы можно получить доступ с помощью [i] [j].Компилятор автоматически преобразует это в доступ к (n * i + j) -ому элементу фактически размещенного одномерного массива.
Предположим теперь, что я хотел бы выделить n по n матрице a накуча, а не стек.Затем я могу сделать следующее:
int main()
{
int n;
cin >> n;
int** a;
a = new int*[n];
for (int i=0;i<n;i++) a[i] = new int[n];
...
}
Теперь я снова могу получить доступ к (i, j) -ому элементу как [i] [j].Тем не менее, это не совсем эквивалентно ситуации, описанной выше, так как мне фактически пришлось выделить место для n * n int и n указателей на int.Кроме того, доступ к [i] [j] теперь влечет за собой два доступа к памяти вместо одного.С другой стороны, вычисление индекса n * i + j избегается.
Предположим теперь, что меня интересует n по m матриц, где m мало, например, m = 2.Использование массива указателей строк приводит к потере 33% пространства.Есть ли способ избежать этого?
Конечно, я могу выделить одномерный массив и выполнить индексную арифметику самостоятельно, но мне это кажется не лучшим решением.
Любая информация будет оценена!