Многомерные динамические массивы и многомерные векторы

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

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Капча * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.