Решил написать для себя маленькую шпаргалку по созданию двухмерного и трёхмерного динамического массива и таких же многомерных векторов (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;
}