【问题标题】:C++ Two Dimensional Arrays [duplicate]C ++二维数组[重复]
【发布时间】:2019-06-23 23:30:38
【问题描述】:

我正在尝试使用二维数组和 PNG 图像制作一个基本的块加载系统。例如,我只是想知道是否可以创建一个未初始化的数组;

Chunk[][] chunks;

然后根据PNG图片的大小进行初始化,用不同的rgb像素代表不同的瓦片。

假设图像是 15x25,是否可以用这样的方式初始化二维数组?

chunks = new Chunk[15][25];

或者我应该制作一个大数组,然后将未设置的索引设置为 VOID 磁贴,我可以简单地制作。

感谢大家的帮助!

【问题讨论】:

  • How do I declare a 2d array in C++ using new? 的可能重复项。我建议使用 std::array<std::array<Chunk, 15>, 25> 或按照您自己的 15*25 1D 数组的建议。
  • 你可以使用std::vector, std::vector<std::vector<Chunk>> chunks(15, std::vector<Chunk>(25));
  • Chunk[][] chunks; 不是合法的 C++,除了第一个维度之外的所有维度都必须使用编译时间常数来指定。使用向量 (1D) 或向量的向量 (2D),而不是 2D 数组。
  • chunks = new Chunk[a][b] 很难实现。数组的大小是恒定的,应该在编译时定义(不过,GCC 确实有一个扩展,允许const int 确定大小)。无法在编译时读取此 PNG 图像或一般文件。因此,您应该使用其他容器,例如std::vector<T>,其大小不必预先确定。
  • 这些重复项都不正确,问题需要具有动态维度的连续内存块。

标签: c++ arrays


【解决方案1】:

C++ 不像 C 那样支持变长数组。现代的、惯用的 C++ 也不鼓励使用 std::vectorstd::array 上的原始数组,它们也可以在 2D 中使用,如下所示:

std::size_t x = /* get X dimension */
std::size_t y = /* get Y dimension */
std::vector<std::vector<Chunk>> chunks(x, std::vector<Chunk>(y));

std::vector 还具有自动大小管理和允许可变长度初始化器的优点,这与 std::array 不同,据我所知,它只允许在初始化期间使用常量。

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 1970-01-01
    • 2015-07-15
    • 2017-02-06
    • 2021-08-11
    • 2013-01-08
    • 2017-09-20
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多