有没有办法在 C++ 中制作动态二维数组?

Ede*_*dex 2 c++ multidimensional-array

所以我想创造一个方形世界的游戏。

开始游戏时,用户应该能够指定世界的大小。

世界被保存为短裤的二维数组。

const short gameSize = 4;
short world[gameSize][gameSize];
Run Code Online (Sandbox Code Playgroud)

short gameSize必须const的,否则,我不能忍受gameSize的大小world[][]

但是,这不允许我设置gameSize为玩家希望的大小。

我想到了一些简单的东西

short gameSize = 0;
cout << "World size?" << endl;
cin >> gameSize;
short world[gameSize][gameSize];
Run Code Online (Sandbox Code Playgroud)

如前所述,这行不通。

在游戏中,以后将无法更改 gameSize 的值。

我怎么能做到这一点?

Fra*_*ank 6

  1. 不要使用new链接的问题/答案会引导您这样做。在您的情况下这是不必要的,并且会无缘无故地增加潜在错误的风险。
  2. 使用std::vector<short>来管理内存的可转位块存储世界价值观。
  3. 根据需要将 2D 坐标转换为索引。
  4. (可选)将其全部封装在一个类中,以便将其隐藏
#include <vector>
#include <cassert>
#include <iostream>

class GameWorld {
  std::size_t world_size_;
  std::vector<short> data_;

public:
  GameWorld(std::size_t size) 
    : world_size_(size) 
    , data_(size * size) {}

  short& operator()(std::size_t x, std::size_t y) {
    assert(x < world_size_ && y < world_size_);

    return _data[y + x * world_size_];
  }

  const short& operator()(std::size_t x, std::size_t y) const {
    assert(x < world_size_ && y < world_size_);

    return _data[y + x * world_size_];
  }
};


int main() {
  short gameSize = 0;
  std::cout << "World size?" << std::endl;
  std::cin >> gameSize;
  GameWorld world(gameSize);

  // Set the value of [0, 0] to 4
  world(0, 0) = 4;
}
Run Code Online (Sandbox Code Playgroud)

这里发生了一些事情:

  1. 使用vector<short>将为您提供动态大小以及内存安全性。即事情将根据需要“自动”清理。
  2. 您可能会想使用vector<vector<short>>,以便world[x][y]“正常工作”。但这并不是很好,因为内存将无处不在,将其紧密地打包到一维数组中通常会给您带来一系列性能优势。
  3. 您可能“认为”调用函数和对索引进行数学运算很昂贵,但这实际上与您world[x][y]在之前的代码中调用时编译器所做的完全相同,因此这里不会产生额外的成本。
  4. assert()在调试模式下构建时,s 将捕获潜在的错误,并在发布/NDEBUG 模式下完全消失。所以你有一个额外的“免费”安全网。

奖励:如果您想开始涉足模板编程,这是一个很好的学习起点。模板GameWorld,以便它可以是一个世界floatint或者一些struct Cell不是始终是一个世界short是有用的,容易做到的,而不是破坏性的代码的其余部分。