我以这种方式制作3D阵列:
#define P 1000 int
SPACE3D[P*2][P*2][P*2];
但是我得到以下编译错误:
错误1错误C2148:数组的总大小不得超过0x7fffffff 字节
我能做些什么来避免这个错误吗?
我还试图像这样初始化3D数组:
int SPACE3D[P*2][P*2][P*2]={0};
通过这种方式,我没有构建错误,但程序崩溃了。
有什么建议吗?
答案 0 :(得分:3)
您需要使用new
或malloc()
在堆上创建数组,而不是在堆栈上创建数组。例如:
int* SPACE3D = new int[P*2*P*2*P*2];
现在你需要使用算术索引它。如果您更喜欢更自然,也许更安全的界面,那么标准库之外还有很多矩阵类可用。但是,请不要使用矢量矢量矢量,因为如果矩阵实际上是矩形(即不是锯齿状/稀疏的),效率非常低。
答案 1 :(得分:2)
您应该在堆上而不是堆栈上分配大块内存:
int array[2*P][2*P][2*P]; // placed on the stack
int* array = new int[8*P*P*P]; // placed on the heap
vector<int> array(8*P*P*P); // vector uses heap storage
在堆栈上,你基本上只限于几兆字节的内存,而在堆上你可以获得很好的计算机RAM(例如几GB)。
请记住:1000 * 1000 * 1000整数的3D数组需要4 GB内存!
此外,我建议为您的3D阵列构建一个小类:
template<typename K>
class Array3D
{
public:
Array3D(int size) // beware, data is not initialized!
: size_(size), data_(size*size*size) {}
int size() { return size_; }
size_t index(int x, int y, int z) const {
return x + size_*(y + size_*z);
}
K& operator(int x, int y, int z) {
return data_[index(x,y,z)];
}
private:
size_t size_;
vector<K> data_;
};
你可以这样使用它:
Array3D arr(1000);
arr(12,43,745) = 15;
此代码段缺少许多有用的功能,但它显示了如何构建3D数组的基本原则。要么建立类似的东西,要么使用其中的一个库。
在我看来,在C ++中,我总是使用数组的数据类型(1D,2D,...)来存储数组内存和数组大小,并提供至少某种边界信息。
答案 2 :(得分:1)
分配一个3d数组,将其分配到堆栈上,看起来它太大了。
要了解如何在堆上分配它,请参阅以下答案:C++ Multi-dimensional Arrays on the Heap
具体来说,就你的情况而言:
#define P 1000
typedef int SPACE2D_t[P*2][P*2];
SPACE2D_t* SPACE3D = new SPACE2D_t[P*2];
SPACE3D[/* from 0 to P*2-1 */][/* from 0 to P*2-1 */][/* from 0 to P*2-1 */] = 42;
delete [] SPACE3D;
答案 3 :(得分:1)
让我们从非技术方面解决这个问题:当你将数组命名为“space”时,我会假设你想要描绘空间。一大堆虚无和一些行星。也许是一些宇宙飞船。让它成为很多行星和很多宇宙飞船。在10个行星,每个10艘船,我们是110个单位。
使用您的阵列,您可以描述1000x1000x1000单位。大多数都是空的。没有。
在现实生活中,你也不这样做。如果有人问你大象在你所在城市的哪个地方,你可能会说“动物园里有4只大象”。你不会去“我房间里没有人,隔壁房间里没有房间,房间里没有房间,房间上面没有房间,房间旁边没有房间,没有在厨房里,街上没有人......“
你提到大象是的地方,这意味着其他地方都没有。否则就会浪费时间和纸张。
这就是你的计划的方式。列出存在的东西。如果你在[1,56,784]的现有事物清单中没有任何内容,那么这意味着什么都没有。这样,只要您拥有现有宇宙飞船的列表,您的宇宙就没有限制。甚至不是1000x1000x1000。