C ++初始化结构的2D数组

时间:2016-01-29 00:58:39

标签: c++ arrays

我正在编写一个允许用户玩数独游戏的程序。每个谜题都是2d结构数组,但我无法一次性初始化数组。有没有办法做到这一点,而不需要为数组的每个元素初始化结构的每个部分?这是我的一些代码。

class Sudoku {
   protected:
   struct Puzz {
      int Ans;
      // IsClue is used further in the program so the user cannot change the clues given.
      bool IsClue;  
   };
   Puzz Puzzle[9][9]; // I chose a 2D array so represent the 9 rows and columns of a sudoku puzzle
};

我尝试了以下一些方法:

Puzzle[][9] = {{0, false, 8, true,  0, false, 6, true,  7, true,  0, false, 0, false, 0, false, 0, false}, //...etc, going on for each row
Puzzle[9][9] = // etc, etc, but I get an error saying "Expected an expression

是初始化要执行的每个元素的唯一方法

Puzzle[x][y].Ans = x; Puzzle[x][y].IsClue = true/false;?

4 个答案:

答案 0 :(得分:1)

问题是您尝试分配给数组,而这根本不可能。你需要实际初始化它,这是完全不同的。

如果你不介意写很多几乎相同的行,那么你可以使用constructor member initializer list。比如说。

Sudoku::Sudoku()
    : Puzzle{{...}, {... }, ... }
{}

如果数组中只有少数结构与某些默认值不同,那么您可以使用例如数组将数组中的所有条目设置为相同的默认值。 std::fill然后更改那些具有特殊值的条目。

答案 1 :(得分:0)

要初始化二维数组,请使用for循环。如:

 for (int i = 0; i < row_count; i++) {
    for (int j = 0; j < col_count; j++) {
       item[i][j] = initial_value;
    }
 }

如果你想使用如上所述的初始化列表,你可以通过简单地将结构的每个实例包装在括号中来实现。但是,使用文字初始化您的sodoku板并不是为播放器生成sodoku板的特别可扩展的方法。也就是说,而不是:

Puzzle puzz[9][9] = {{0, false, 8, true,  0, false, 6, true,  7, true,  0, false, 0, false, 0, false, 0, false, ...}};

你会使用:

Puzzle puzz[9][9] = {
  {  // First row
     {0, false}, // first column
     {8, true}, // second column
     ...
  },
  {  // Second row
     ...
  },
  ...
};

由于这是C ++,您可能希望考虑使用嵌套向量(即vector<vector<Cell>>)来表示您的电路板。虽然这可能是过度的,特别是对于Sodoku板(特别是如果它总是9x9),这将允许您更容易地表示非标准板尺寸,并且矢量数据结构具有默认初始化/填充所有成员的能力具有预先指定的值。正如@paddy在评论中恰当地指出的那样,还有其他函数(如std::fill可以与普通数组一起使用来处理常见用例。

答案 2 :(得分:0)

您可以使用c ++ 11或更高版本中的初始化列表进行初始化:

"/auth/twitter"

如果在类中,您可以默认以相同的方式构造它:

Puzz Puzzle[2][2] = {
    { {8, true}, {9, false} },
    { {10, true}, {11, false} }
};

虽然,如果它非常大,这可能会变得相当混乱。所以最后的方法可能是在循环中初始化它。

Live example.

答案 3 :(得分:0)

这是一个显示如何初始化2 x 2阵列的示例。我将把它扩展到9 x 9阵列。

class Sudoku {
   Sudoku();
   protected:
   struct Puzz {
      int Ans;
      bool IsClue;  
   };
   Puzz Puzzle[2][2];
};

Sudoku::Sudoku() : Puzzle{{{0, false}, {1, true}}, {{2, false}, {3, true}}}
{
}

话虽如此,创建一个Puzz的默认构造函数可能更容易,它对大多数对象做了明智的事情,然后只修改PuzzleSudoku的选择元素& #39; s构造函数。

class Sudoku {
   Sudoku();
   protected:
   struct Puzz {
      int Ans;
      bool IsClue;  
      Puzz() : Ans(0), IsClue(false) {}
   };
   Puzz Puzzle[2][2];
};

Sudoku::Sudoku()
{
   // Change specific elements of Puzzle
}