c++ - 如何使用枚举有效填充 2D std::array

标签 c++ arrays enums c++14 stdarray

我正在尝试找到一种有效且正确的方法来填充 2D std::array矩阵 enum值(value)。我正在这样做:

#include <iostream>
#include <array>

template<class T, size_t ROW, size_t COL>
using Matrix = std::array<std::array<T, COL>, ROW>;

enum class State { FREE = 0, BUSY, BLOCKED, RESERVED };

int main() {
  const int mapX = 4;
  const int mapY = 9;

  // create a 5x10 2D array
  Matrix<State, mapY, mapX> MapMatrix;

  // fill array with State::RESERVED value
  for (int y = 0; y <= mapY; y++) MapMatrix[y].fill(State::RESERVED);

  std::cout << "MapMatrix contains:\n";

  for (int y = 0; y <= mapY; ++y) {
    for (int x = 0; x <= mapX; ++x) {
      std::cout << static_cast<int>(MapMatrix[x][y]) << " ";
    }
    std::cout << std::endl;
  }

  return 0;
}

for循环我正在做用enum填充矩阵的最佳方法值(value)?有没有办法在声明 Matrix<State, mapY, mapX> MapMatrix 期间填充矩阵(就像构造函数)?

谢谢!

最佳答案

除非用零填充,或者显式指定每个元素,否则无法在初始化时填充它。如果您重新排列枚举以便 RESERVED为零,那么你可以像这样初始化它:

Matrix<State, mapY, mapX> MapMatrix = {};

如果你做不到这一点,那么是的,for 循环可能是最好的选择。把事情简单化。但你有一些问题。首先,您的评论说您正在创建一个 5x10 数组,但事实并非如此。您正在创建一个 4x9 数组。如果要创建 5x10 数组,则需要传递 5 和 10 作为模板参数。我认为您可能会对大小为 N 的数组的最后一个元素是 N - 1 这一事实感到困惑。这个离一问题仅与访问数组的元素有关,与指定数组的大小无关数组。

其次,您正在迭代数组的末尾,因为您的循环条件是 y <= mapY ,而不是 y < mapY 。但如果你只使用 range-for 循环会更好。

for (auto& arr : MapMatrix)
    arr.fill(State::RESERVED);

关于c++ - 如何使用枚举有效填充 2D std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928252/

相关文章:

java - 在枚举中实现内部接口(interface)时的循环继承

c++ - (编辑)如何使用 cpp 文件中声明的源在 Windows 中导出模板特化

vector 的 C++ 初始化

ios - 使用核心数据重新排列 TableView 单元格的顺序

java - 两个数之和等于给定数

Java:以任何枚举作为键进行映射

c# - 将 C++ 数组返回到 C#

c++ - 使用 OpenSSL 库在 C++ 中生成 SHA 哈希

java - 返回方法时出现 ArrayExceptionOutOfBounds

enums - 在 OpenAPI (Swagger) 中重用枚举的子集