当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C++中解决一个非常大的二维数组》经验,为你挑选了2个好方法。

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

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

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

谢谢!



1> Adam Mitz..:

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

int *array = new int[800*800];

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


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

2> Kevin..:

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

template 
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 buffer;
};

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

void foo()
{
    Array2D zbuffer;

    // Do something with zbuffer...
}

我希望这有帮助!

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

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有