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 << " 轮内获胜";