- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
5.6 嵌套循环和二维数组
如本章前面所述,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论