如果您需要分配的空间
必须是连续的,那么它必须由单个“new”进行分配,否则内存将不连续。
它会看起来像这样:
int d1 = 10;
int d2 = 10;
int d3 = 10;
int* array3D = new int[d1 * d2 * d3];
通过这样的方式,您已经为您的三维数组分配了足够的空间,现在需要将其映射到三维空间。
array3D[(1*d1*d2) + (2*d2) + (3)]; // access element at 1,2,3
通过这种方法,你可以将你分配的1D数组中的每个点映射到3D空间中的唯一点。
正如你所看到的,这种方法非常容易出错。因此,你不应该像这样做。
不要使用new/delete来分配这样的数组:
使用std:array或std:vector来为你处理它。使用原始的new/delete会导致错误,如果有任何东西是用new分配的并且你忘记删除它,或者你忽略了某些事情,就会导致内存泄漏。
void test(){
int* a = new int[20];
if(error)
return;
delete a;
}
std::array
是在编译时确定大小且永远不需要更改的数组类型。
另一方面,std::vector
可以在运行时动态调整大小,因此适用于大小不确定的情况。
std::array<int, 10> test1; // creates a fixed size array of size 10 and type int.
std::vector<int> test2(10); // creates an array that can change at runtime:
test2.push_back(2); // the vector now has size 11 and the last element is equal to 2
这样你也不需要在最后删除
数组。
如果您想在代码中更频繁地使用此功能,将所有这些功能包装在一个类中可能非常有帮助:
#include <array>
template<typename T, std::size_t _D1, std::size_t _D2, std::size_t _D3>
class Array3D{
std::array<T, _D1*_D2*_D3> elements;
public:
std::size_t D1(){ return _D1; }
std::size_t D2(){ return _D1; }
std::size_t D3(){ return _D1; }
T& element(std::size_t d1, std::size_t d2, std::size_t d3){
return elements[(d1*_D1*_D2) + (d2*_D2) + (d3)];
}
};
int main(){
Array3D<int, 10, 10, 10> array;
array.element(1,2,3) = 5;
for(std::size_t i = 0; i < array.D1(); i++)
for(std::size_t j = 0; j < array.D2(); j++)
for(std::size_t k = 0; k < array.D3(); k++)
array.element(i,j,k) = 5;
}