Хотя этот популярный ответ даст вам желаемый синтаксический индекс, он вдвойне неэффективен: большой и медленный как в пространстве, так и во времени. Есть лучший способ.
Почему этот ответ большой и медленный
Предлагаемое решение - создать динамический массив указателей, а затем инициализировать каждый указатель своим собственным независимым динамическим массивом. Преимущество этого подхода состоит в том, что он дает вам синтаксис индексации, к которому вы привыкли, поэтому, если вы хотите найти значение матрицы в позиции x, y, вы скажете:
int val = matrix[ x ][ y ];
Это работает, потому что matrix [x] возвращает указатель на массив, который затем индексируется с помощью [y]. Разбивка:
int* row = matrix[ x ];
int val = row[ y ];
Удобно, да? Нам нравится наш [x] [y] синтаксис.
Но решение имеет большой недостаток , заключающийся в том, что оно и жирное, и медленное.
Почему?
Причина, по которой он толстый и медленный, на самом деле одна и та же. Каждая «строка» в матрице представляет собой отдельно выделенный динамический массив. Распределение кучи требует больших затрат как во времени, так и в пространстве. Распределитель требует времени, чтобы выполнить выделение, иногда запуская O (n) алгоритмы, чтобы сделать это. И распределитель «дополняет» каждый из ваших массивов строк дополнительными байтами для учета и выравнивания. Это дополнительное место стоит ... ну ... дополнительное место. При освобождении матрицы также потребуется дополнительное время для освобождения матрицы, кропотливого освобождения каждого отдельного распределения строк. Встает в меня, просто думая об этом.
Есть еще одна причина, по которой он медленный. Эти отдельные распределения имеют тенденцию жить в прерывистых частях памяти. Одна строка может быть по адресу 1000, другая по адресу 100000 - вы поняли. Это означает, что когда вы пересекаете матрицу, вы перепрыгиваете через память, как дикий человек. Это приводит к потере кеша, что значительно замедляет время обработки.
Итак, если у вас в абсолюте должен быть симпатичный синтаксис [x] [y], используйте это решение. Если вам нужна быстрота и малость (и если вас это не волнует, почему вы работаете в C ++?), Вам нужно другое решение.
Другое решение
Лучшее решение состоит в том, чтобы выделить всю матрицу в виде одного динамического массива, а затем использовать (слегка) умную собственную индексную математику для доступа к ячейкам. Индексная математика очень умна; нет, это совсем не умно: это очевидно.
class Matrix
{
...
size_t index( int x, int y ) const { return x + m_width * y; }
};
Учитывая, что эта функция index()
(которую я представляю, является членом класса, потому что она должна знать m_width
вашей матрицы), вы можете получить доступ к ячейкам внутри вашего матричного массива. Матричный массив выделяется так:
array = new int[ width * height ];
Итак, эквивалент этого в медленном, жирном растворе:
array[ x ][ y ]
... это быстрое, маленькое решение:
array[ index( x, y )]
Грустно, я знаю. Но вы привыкнете к этому. И ваш процессор поблагодарит вас.