3D数组c ++太大了?如何使用3D阵列?

时间:2014-03-27 13:22:13

标签: c++ arrays

我以这种方式制作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};

通过这种方式,我没有构建错误,但程序崩溃了。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

您需要使用newmalloc()在堆上创建数组,而不是在堆栈上创建数组。例如:

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。