如何在C++中解决一个非常大的二维数组

Bry*_*nny 9 c++ arrays graphics 2d zbuffer

我需要创建一个大小为800x800的2D int数组.但这样做会造成堆栈溢出(哈哈).

我是C++的新手,所以我应该做一些像向量的向量吗?只是将2d数组封装成一个类?

具体来说,这个数组是我在图形程序中的zbuffer.我需要为屏幕上的每个像素存储az值(因此大尺寸为800x800).

谢谢!

Ada*_*itz 11

你需要大约2.5兆,所以只使用堆应该没问题.除非需要调整大小,否则不需要向量.有关使用"2D"堆数组的示例,请参阅C++ FAQ Lite.

int *array = new int[800*800];
Run Code Online (Sandbox Code Playgroud)

(完成后别忘delete[]了.)

  • 当然,但我不建议使用全局,因为这不是一般的好解决方案 - 它在范围和使用寿命方面没有给你太多的灵活性.对于这个提问者来说它可能会很好用,所以请继续留下你自己的答案. (2认同)

Kev*_*vin 10

到目前为止,每篇文章都为程序员留下了内存管理.这可以而且应该避免.ReaperUnreal非常接近我所做的,除了我使用矢量而不是数组,并且还使用尺寸模板参数并更改访问功能 - 哦,只是IMNSHO清理了一下:

template <class T, size_t W, size_t H>
class Array2D
{
public:
    const int width = W;
    const int height = H;
    typedef typename T type;

    Array2D()
        : buffer(width*height)
    {
    }

    inline type& at(unsigned int x, unsigned int y)
    {
        return buffer[y*width + x];
    }

    inline const type& at(unsigned int x, unsigned int y) const
    {
        return buffer[y*width + x];
    }

private:
    std::vector<T> buffer;
};
Run Code Online (Sandbox Code Playgroud)

现在你可以在堆栈上分配这个2-D数组了:

void foo()
{
    Array2D<int, 800, 800> zbuffer;

    // Do something with zbuffer...
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

编辑:从中删除了数组规范Array2D::buffer.感谢Andreas抓住了!