1

我想用 C++ 设计一个填字游戏编辑器。它是一个块网格,每个块包含一个字母(或在两个单词之间为黑色),可能是一个数字和一条粗或细的边界线。因此,块是它们的容器类。网格是块的容器。但是我将如何构建网格?

  1. 原始二维数组:Block grid[row][column]?
  2. 向量的向量:vector<vector<Block>>?
  3. 两个向量,一个用于行,一个用于列:vector<Block> row; vector<Block> column?
  4. 一个映射,哪些键是行/列对,值是块:map<int[2], Block>
4

1 回答 1

1

默认情况下,纯静态/动态数组(或它们的包装器)是最可取的:它们对程序员(随机访问 API 等)和处理器(内存局部性等)来说都是最舒服的。

Block数组/向量中最容易实现的布局是[first row Blocks..., second row Blocks..., etc]- 充当二维数组的一维数组。它可以像 一样被索引crossword[x + y * crossword.width()],这并不漂亮,因此您可能希望使用带有 API 的库/自行编写的包装器,crossword(x, y)它可以在后台执行该xy-to- i-index 转换。

也许是这样的:

class Crossword {
    std::vector<Block> raw;
    size_t length{}; // can't name it "width" because there's a "width()" member function below

public:
    Crossword() {}
    Crossword(size_t x, size_t y): raw(x * y), length{x} {}
    Crossword(Crossword&& other) noexcept { *this = std::move(other); }
    Crossword& operator=(Crossword&& other) noexcept {
        std::swap(raw, other.raw);
        std::swap(length, other.length);
        return *this;
    }

    auto size() const { return raw.size(); }
    auto width() const { return length; }
    auto height() const { return size() / length; }
    auto& operator()(size_t x, size_t y) const { return raw[x + y * length]; }
    auto& operator()(size_t x, size_t y) { return raw[x + y * length]; }
};
于 2021-12-03T12:53:04.317 回答