Для многомерного массива, вероятно, наилучшим вариантом будет использование библиотеки multi_array boost:
typedef boost::multi_array<float, 3> array_type;
array_type p(boost::extents[100][100][100]); // make an 100x100x100 array of floats
p[1][2][3] = 4.2;
Это позволяет полностью абстрагироваться от выделения и деталей настройки многомерного массива. Кроме того, поскольку он использует линейное хранилище, вы получаете преимущества эффективности линейного хранилища с легкостью доступа к косвенным ссылкам.
В противном случае у вас есть три других основных варианта.
Самый вариант C ++ -y без использования внешних библиотек - использовать контейнер STL:
std::vector<float **> p;
p.resize(100);
Как и в случае multi_array
, p
будет автоматически освобожден при выходе из области видимости. Вы можете получить векторные границы с p.size()
. Однако вектор будет обрабатывать только одно измерение для вас, поэтому вы в конечном итоге будете выполнять вложенные векторы (ick!).
Вы также можете использовать new
напрямую:
float ***p = new float**[100];
Для освобождения:
delete [] p;
У этого есть все недостатки std::vector
, плюс он не освободит его для вас, и вы не сможете получить размер позже.
Приведенные выше три метода вызовут исключение типа std::bad_alloc
, если им не удастся выделить достаточно памяти.
Наконец, для полноты, есть маршрут C, с calloc()
:
float ***p = (float ***)calloc(100, sizeof(*p));
бесплатно:
free((void*)p);
Это исходит от C и немного страшнее всех приведений. Для классов C ++ он также не будет вызывать конструкторы для вас. Кроме того, нет проверки того, что sizeof в аргументе соответствует приведению.
Если calloc()
не выделяет память, возвращается NULL; вам нужно проверить это и разобраться с этим.