C++学习笔记29:嵌套循环和二维数组

        一维数组:数组元素可以看做是一行数据。

        二维数组:更像是一个表格,既有行数据又有列数据。

        C++没有提供二维数组类型,但用户可以创建每个元素本身都是数组的数组。例如,假设要存储 5 个城市在 4 年间的最高气温,可以这样声明数组:
        int maxtemps[4][5];
        该声明意味着 maxtemps 是一个包含 4 个元素的数组,其中每个元素都是一个由 5 个整数组成的数组,如下图所示,可以将 maxtemps 数组看作由 4 行组成,其中每一行有 5 个温度值。

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

         假设要打印数组的所有内容,可以用一个 for 循环来改变行,用另一个被嵌套的 for 循环来改变列:
        for ( int row = 0; row < 4; row++ )
        {
                for ( int col = 0; col < 5; ++col )
                        cout << maxtemps[row][col] << "\t";
                cout << endl;
        }

        对于每个 row 值,内部的 for 循环将遍历所有的 col 值,并在每个值之后打印一个制表符,打印完每行后,打印一个换行符。

初始化二维数组
        创建二维数组时,可以初始化其所有元素。二维数组的初始化由一系列逗号分隔的一维数组初始化(用花括号括起)组成:
        int maxtemps[4][5] = 
        {
                { 96, 100, 87, 101, 105 }
,
                { 96, 98, 91, 107, 104 },
                { 97, 101, 93, 108, 107 },
                { 98, 103, 95, 109, 108 }
        }
;
        注意:花括号、逗号、分号均不能漏掉!

使用二维数组
        下面的示例程序演示了二维数组和嵌套循环的使用:

//nested.cpp -- nested loops and 2-D array
#include <iostream>
const int Cities = 5;
const int Years = 4;
int main()
{
	using namespace std;
	const char * cities[Cities] =
	{
		"Gribble City", "Gribbletown", "New Gribble", "San Gribble", "Gribble Vista"
	};
	int maxtemps[Years][Cities] = 
	{
		{96,100,87,101,105}, {96,98,91,107,104}, {97,101,93,108,107}, {98,103,95,109,108}
	};
	cout << "Maximum temperatures for 2008 - 2011\n\n";
	for (int city = 0; city < Cities; ++city)
	{
		cout << cities[city] << ":\t";
		for (int year = 0; year < Years; ++year)
		{
			cout << maxtemps[year][city] << "\t";
		}
		cout << endl;
	}
	return 0;
}

         上面的示例程序初始化了一个二维数组,并使用了一个嵌套循环。这一次,循环的顺序相反,将列循环(城市索引)放在外面,将行循环(年份索引)放在里面。
        另外,它还采用了C++常用的做法:将一个指针数组初始化为一组字符串常量。也就是说,将 cities 声明为一个 char 指针数组,这使得每个元素(如 cities[0] )都是一个 char 指针,可被初始化为一个字符串的地址。
        在这个示例中,可以使用 char 数组的数组,而不是字符串指针数组,在这种情况下,声明如下:
        char cities[Cities][25] =      // array of 5 arrays of 25 char
        { "Gribble City", "Gribbletown", "New Gribble", "San Gribble", "Gribble Vista" };
        上述方法将全部 5 个字符串的最大长度限制为 24 个字符。指针数组存储 5 个字符串的地址,而使用 char 数组的数组时,将 5 个字符串分别复制到 5 个包含 25 个元素的 char 数组中。因此,从存储空间的角度说,使用指针数组更为经济;然而,如果要修改其中的任何一个字符串,则二维数组是更好的选择。
        另外,还可以使用 string 对象数组,而不是字符串指针数组,在这种情况下,声明如下:
        const string cities[Cities] =      // array of 5 strings
        { "Gribble City", "Gribbletown", "New Gribble", "San Gribble", "Gribble Vista" };
        如果希望字符串是可修改的,则应省略限定符 const。在希望字符串是可修改的情况下,string 类自动调整大小的特性将使这种方法比使用二维数组更为方便。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值