C++ 多维数组

多维数组

多维数组就是数组的数组。

要声明一个多维数组,需要定义变量类型,指定数组名称,后面跟上方括号,方括号内指定主数组的元素数量,然后再跟上一对方括号,指示子数组的元素数量:

string letters[2][4];

与普通数组一样,您可以使用数组字面量(花括号内的逗号分隔列表)来插入值。

在多维数组中,数组字面量中的每个元素都是另一个数组字面量。

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

数组声明中的每对方括号都会为数组增加一个维度。像上面这样的数组就有两个维度。

数组可以有任意数量的维度。数组的维度越多,代码就越复杂。以下数组有三个维度:

string letters[2][2][2] = {
  {
    { "A", "B" },
    { "C", "D" }
  },
  {
    { "E", "F" },
    { "G", "H" }
  }
};

访问多维数组的元素

要访问多维数组的元素,需要指定数组中每个维度的索引号。

以下语句访问 letters 数组第一行(0)第三列(2)的元素值。

实例

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

cout << letters[0][2];  // 输出 "C"

亲自试一试

请记住:数组索引从 0 开始:[0] 是第一个元素。[1] 是第二个元素,依此类推。

更改多维数组中的元素

要修改元素的值,需要引用元素在每个维度中的索引号:

实例

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};
letters[0][0] = "Z";

cout << letters[0][0];  // 现在输出 "Z" 而不是 "A"

亲自试一试

遍历多维数组

要遍历多维数组,您需要为数组的每个维度使用一个循环。

下例输出 letters 数组中的所有元素:

实例

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

for (int i = 0; i < 2; i++) {
  for (int j = 0; j < 4; j++) {
    cout << letters[i][j] << "\n";
  }
}

亲自试一试

此例显示如何遍历三维数组:

实例

string letters[2][2][2] = {
  {
    { "A", "B" },
    { "C", "D" }
  },
  {
    { "E", "F" },
    { "G", "H" }
  }
};

for (int i = 0; i < 2; i++) {
  for (int j = 0; j < 2; j++) {
    for (int k = 0; k < 2; k++) {
      cout << letters[i][j][k] << "\n";
    }
  }
}

亲自试一试

为什么使用多维数组?

多维数组非常适合表示网格。

以下实例展示了它们在实际应用中的用途。在这个例子中,我们使用多维数组来表示一个小型的战舰游戏:

实例

// 我们用 "1" 表示有船。  
bool ships[4][4] = {  
  { 0, 1, 1, 0 },  
  { 0, 0, 0, 0 },  
  { 0, 0, 1, 0 },  
  { 0, 0, 1, 0 }  
};  
  
// 使用这些变量跟踪玩家命中的次数和他们玩了多少轮  
int hits = 0;  
int numberOfTurns = 0;  
  
// 允许玩家继续游戏,直到他们击中所有四艘船  
while (hits < 4) {  
  int row, column;  
  
  cout << "选择坐标\n";  
  
  // 询问玩家要选择哪一行  
  cout << "选择0到3之间的行号:";  
  cin >> row;  
  
  // 询问玩家要选择哪一列  
  cout << "选择0到3之间的列号:";  
  cin >> column;  
  
  // 检查这些坐标上是否有船  
  if (ships[row][column]) {  
    // 如果玩家击中了船,则通过将值设置为零来移除它。  
    ships[row][column] = 0;  
  
    // 增加命中计数器  
    hits++;  
  
    // 告诉玩家他们击中了一艘船以及还剩下多少艘船  
    cout << "击中!还剩下 " << (4-hits) << " 艘船。\n\n";  
  } else {  
    // 告诉玩家他们未击中  
    cout << "未击中\n\n";  
  }  
  
  // 计算玩家玩了多少轮  
  numberOfTurns++;  
}  
  
cout << "胜利!\n";  
cout << "您在 " << numberOfTurns << " 轮内获胜";

亲自试一试