Создание динамического 2D-массива

Мне нужно иметь двойной массив 2D.
Его ширина около 900. Его высота также (то же значение ширины).

Имея дело с двумя циклами (один для ширины и один для высоты), мне действительно нужно получить доступ ко всем пикселям изображения 900X900, которое я буду обрабатывать.

Размер массива слишком велик (ошибка при указании числа raw и столбца).

Я думал о том, чтобы установить это с помощью динамического массива, чтобы оптимизировать время вычислений и освобождать память каждый раз, когда я имею дело с одним пикселем в двух циклах.

Но я действительно не могу найти синтаксис, который мне нужен для объявления двумерного динамического массива (malloc, установки значений элементов массива и освобождения памяти).

1

Решение

Оберните это в классе:

class Matrix2D {
typedef std::vector<double> Column;
std::vector<Column> columns;
public:
Matrix2D(unsigned int width, unsigned int height) :
columns(width, Column(height)) {
}

double& at(unsigned int i, unsigned int j) {
return columns[i][j];
}
};

Matrix2D matrix(900, 900);

matrix.at(45, 65) = 1234.5678;
3

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

Мне нужно иметь 2D массив double

Поскольку вы используете C ++, вы должны использовать классы STL, которые позаботятся об уродливом управлении памятью. Итак, вы на самом деле ищете std::vector< std::vector<double> >или для удобства чтения вашего кода:

#include <vector>
typedef std::vector<double> DVector;      // row represented by vector of doubles
typedef std::vector<DVector> MyVector;    // 2D array as a vector of these rows

И затем избегайте использования динамического размещения везде, где это возможно. Извлекать выгоду RAII идиома:

{
MyVectorarr;  // vector object with automatic storage duration
} // <-- vector is automatically destructed when execution goes out of scope

Вопросы, которые могут вам помочь:
Многомерный вектор
Инициализация вектора векторов?
вектор вектора

2

Я связываю malloc с чистым C, а не C ++ (как указано выше, вам следует использовать std :: vector). Однако, если вы действительно хотите:

// allocate the memory in a block
double* block = (double *) malloc(sizeof(double) * xSize * ySize);
// allocate memory for the accessor array
double* accessor = (double*) malloc(sizeof(double*) * xSize);
// assign memory addresses
double* curPtr = block;
for (int i = 0; i < xSize; ++i) {
accessor[i] = curPtr;
curPtr += ySize;
}

// you can now access the array via accessor[x][y]

// now need to free malloced memory:
free(accessor);
free(block);

Если вы сделаете это таким образом, я настоятельно рекомендую связать его с шаблоном RAII, иначе вы в конечном итоге получите утечку памяти. Использование контейнеров STL — лучший подход.

1
По вопросам рекламы [email protected]