返回介绍

5.6 嵌套循环和二维数组

发布于 2024-10-08 23:14:03 字数 3064 浏览 0 评论 0 收藏 0

如本章前面所述,for 循环是一种处理数组的工具。下面进一步讨论如何使用嵌套 for 循环中来处理二维数组。

首先,介绍一下什么是二维数组。到目前为止,本章使用的数组都是一维数组,因为每个数组都可以看作是一行数据。二维数组更像是一个表格—既有数据行又有数据列。例如,可以用二维数组来表示 6 个不同地区每季度的销售额,每一个地区占一行数据。也可以用二维数组来表示 RoboDork 在计算机游戏板上的位置。

C++没有提供二维数组类型,但用户可以创建每个元素本身都是数组的数组。例如,假设要存储 5 个城市在 4 年间的最高温度。在这种情况下,可以这样声明数组:

该声明意味着 maxtemps 是一个包含 4 个元素的数组,其中每个元素都是一个由 5 个整数组成的数组(参见图 5.5)。可以将 maxtemps 数组看作由 4 行组成,其中每一行有 5 个温度值。

图 5.5 由数组组成的数组

表达式 maxtemps[0]是 maxtemps 数组的第一个元素,因此 maxtemps[0]本身就是一个由 5 个 int 组成的数组。maxtemps[0] 数组的第一个元素是 maxtemps [0] [0],该元素是一个 int。因此,需要使用两个下标来访问 int 元素。可以认为第一个下标表示行,第二个下标表示列(参见图 5.6)。

图 5.6 使用下标访问数组元素

假设要打印数组所有的内容,可以用一个 for 循环来改变行,用另一个被嵌套的 for 循环来改变列:

对于每个 row 值,内部的 for 循环将遍历所有的 col 值。这个示例在每个值之后打印一个制表符(使用 C++转义字符表示时为\t),打印完每行后,打印一个换行符。

5.6.1 初始化二维数组

创建二维数组时,可以初始化其所有元素。这项技术建立在一维数组初始化技术的基础之上:提供由逗号分隔的用花括号括起的值列表:

对于二维数组来说,由于每个元素本身就是一个数组,因此可以使用与上述代码类似的格式来初始化每一个元素。因此,初始化由一系列逗号分隔的一维数组初始化(用花括号括起)组成:

可将数组 maxtemps 包含 4 行,每行包含 5 个数字。{94, 98, 87, 103, 101}初始化第一行,即 maxtemps [0]。作为一种风格,如果可能的话,每行数据应各占一行,这样阅读起来将更容易。

5.6.2 使用二维数组

程序清单 5.20 初始化了一个二维数组,并使用了一个嵌套循环。这一次,循环的顺序相反,将列循环(城市索引)放在外面,将行循环(年份索引)放在内面。另外,它还采用了 C++常用的做法,将一个指针数组初始化为一组字符串常量。也就是说,将 cities 声明为一个 char 指针数组。这使得每个元素(如 cities [0])都是一个 char 指针,可被初始化为一个字符串的地址。程序将 cities [0]初始化为字符串“Gribble City”的地址,等等。因此,该指针数组的行为与字符串数组类似。

程序清单 5.20 nested.cpp

下面是该程序的输出:

在输出中使用制表符比使用空格可使数据排列更有规则。然而,制表符设置不相同,因此输出的外观将随系统而异。第 17 章将介绍更精确的、更复杂的、对输出进行格式化的方法。

在这个例子中,可以使用 char 数组的数组,而不是字符串指针数组。在这种情况下,声明如下:

上述方法将全部 5 个字符串的最大长度限制为 24 个字符。指针数组存储 5 个字符串的地址,而使用 char 数组的数组时,将 5 个字符串分别复制到 5 个包含 25 个元素的 char 数组中。因此,从存储空间的角度说,使用指针数组更为经济;然而,如果要修改其中的任何一个字符串,则二维数组是更好的选择。令人惊讶的是,这两种方法使用相同的初始化列表,显示字符串的 for 循环代码页相同。

另外,还可以使用 string 对象数组,而不是字符串指针数组。在这种情况下,声明如下:

如果希望字符串是可修改的,则应省略限定符 const。使用 string 对象数组时,初始化列表和用于显示字符串的 for 循环代码与前两种方法中相同。在希望字符串是可修改的情况下,string 类自动调整大小的特性将使这种方法比使用二维数组更为方便。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文