Решил написать для себя маленькую шпаргалку по созданию двухмерного и трёхмерного динамического массива и таких же многомерных векторов (STL vector), но понял, что она будет полезна не только мне, поэтому я решил поделиться ей с вами :)
Двухмерный вектор
#include <vector> using std::vector; #define HEIGHT 5 #define WIDTH 3 int main() { vector<vector<double> > array2D; // Устанавливаем размерность (HEIGHT x WIDTH) array2D.resize(HEIGHT); for (int i = 0; i < HEIGHT; ++i) array2D[i].resize(WIDTH); // Помещаем некоторые значения array2D[1][2] = 6.0; array2D[3][1] = 5.5; return 0; }
Трёхмерный вектор
#include <vector> using std::vector; #define HEIGHT 5 #define WIDTH 3 #define DEPTH 7 int main() { vector<vector<vector<double> > > array3D; // Устанавливаем размерность (HEIGHT x WIDTH) array3D.resize(HEIGHT); for (int i = 0; i < HEIGHT; ++i) { array3D[i].resize(WIDTH); for (int j = 0; j < WIDTH; ++j) array3D[i][j].resize(DEPTH); } // Помещаем некоторые значения array3D[1][2][5] = 6.0; array3D[3][1][4] = 5.5; return 0; }
Двухмерный динамический массив
#define HEIGHT 5 #define WIDTH 3 int main() { double **p2DArray; // Выделяем память p2DArray = new double*[HEIGHT]; for (int i = 0; i < HEIGHT; ++i) p2DArray[i] = new double[WIDTH]; // Помещаем некоторые значения p2DArray[0][0] = 3.6; p2DArray[1][2] = 4.0; // Освобождаем выделенную ранее память for (int i = 0; i < HEIGHT; ++i) delete [] p2DArray[i]; delete [] p2DArray; return 0; }
Трёхмерный динамический массив
#define HEIGHT 5 #define WIDTH 3 #define DEPTH 7 int main() { double ***p2DArray; // Выделяем память p2DArray = new double**[HEIGHT]; for (int i = 0; i < HEIGHT; ++i) { p2DArray[i] = new double*[WIDTH]; for (int j = 0; j < WIDTH; ++j) p2DArray[i][j] = new double[DEPTH]; } // Помещаем некоторые значения p2DArray[0][0][0] = 3.6; p2DArray[1][2][4] = 4.0; // Освобождаем выделенную ранее память for (int i = 0; i < HEIGHT; ++i) { for (int j = 0; j < WIDTH; ++j) delete [] p2DArray[i][j]; delete [] p2DArray[i]; } delete [] p2DArray; return 0; }
Важная памятка
Ну и напоследок расскажу про грабли на которые я сам однажды наступил.
Если вы помещаете в вектор или динамический массив указатели на динамически создаваемые объекты некоторого класса myClass, а потом очищаете вектор/массив, то помните, что деструктор для вашего myClass вызываться не будет, его необходимо вызывать самостоятельно, иначе получите утечку памяти (memory leak).
Проще показать на примере:
#include <vector> #include <iostream> using namespace std; class myClass { public: myClass() { cout << "was created" << endl; } ~myClass() { cout << "was deleted" << endl; } }; int main() { vector<myClass*> array; array.push_back(new myClass()); array.push_back(new myClass()); /* Вот этот кусок кода забывать нельзя! */ for (int i = 0; i < array.size(); i++) { delete array[i]; // тут будут вызваны деструкторы для myClass } /*--------------------------------------*/ array.clear(); return 0; }