C++ Primer:3.6 多维数组

其他章节:C++ Primer 学习心得

多维数组是数组的数组。
一个数组的元素仍然是数组时,通常用两个维度来定义:一个维度表示数组本身的大小,另外一个维度表示其元素(数组)的大小。

int ia[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组
// 大小为10的数组,它的每个元素都是大小为20的数组,
// 这些数组的元素是含有30个整数的数组
int arr[10][20][30] = {0}; //将所有元素初始化为0

定义数组时对下标运算符的数量没有限制。
对于二维数组来说,把第一个维度称作行,第二个维度称作列。

多维数组的初始化

使用花括号括起来一组值初始化数组。

int ia[3][4] = {
	{0, 1, 2, 3},
	{4, 5, 6, 7},
	{8, 9, 10, 11}
};

其中嵌套着的花括号并非必需的。

int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

在初始化多维数组时也并非所有元素的值都必须包含在初始化列表内。

int ia[3][4] = {{ 0 }, { 4 }, { 8 }};
// 显式地初始化每行的首元素,未列出的元素执行默认初始化
int ix[3][4] = {0, 3, 6, 9};
// 显式地初始化第1行,其他元素执行值初始化,被初始化为0。

多维数组的下标引用

使用下标运算符访问多维数组的元素,数组的每个维度对应一个下标运算符。
如果表达式含有的下标运算符数量和数组的维度一样多,该表达式的结果将是给定类型的元素;反之,如果表达式含有的下标运算符数量比数组的维度小,则表达式的结果将是给定索引处的一个内层数组:

// 用arr 的首元素为ia最后一行的最后一个元素赋值
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1]; // 把row绑定到ia的第二个4元素数组上

程序经常会用到两层嵌套的for循环来处理多维数组的元素

constexpr size_t rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt]; //12 个未初始化的元素
// 对于每一行
for (size_t i = 0; i != rowCnt; ++i)
	//对于行内的每一列
	for (size_t j = 0; j != colCnt; ++j)

// 外层for循环遍历ia的所有元素;内层for循环遍历一维数组的整数元素

使用范围for语句处理多维数组

C++11新增了范围for语句:

for (auto &row: ia)     // 对于外层数组的每一个元素
	for(auto &col: row){ // 对于内层数组的每一个元素

要改变数组的值,选用引用类型rowcol作为循环控制变量。

for (const auto &row: ia) // 对于外层数组的每一个元素
	for(auto col:row) //对于内层数组的每一个元素

即使循环中没有任何写操作,还是将外层循环的控制变量声明成引用类型,避免数组被自动转换为指针。


使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。

指针和多维数组

程序使用多维数组的名称时,也会自动将其转换成指向数组首元素的指针。
多维数组实际上是数组的数组,多维数组名称转换得来的指针实际上是指向第一个内层数组的指针:

int ia[3][4];  // 大小为3的数组,每个元素是含有4个整数的数组
int (*p)[4] = ia;  // p指向含有4个整数的数组
p = &ia[2];   // p指向ia的尾元素

通过auto或者decltype就能尽可能地避免在数组前面加上一个指针类型:

//输出ia中每个元素的值,每个内层数组各占一行
//p指向含有4个整数的数组
for (auto p = ia; p != ia + 3; ++p)
	//q指向4个整数数组的首元素,也就是说,q指向一个整数
	for (auto q = *p; q != *p + 4; ++q)
		cout<< *q:

使用标准库函数beginend也可以实现同样的功能:

//p指向 ia的第一个数组
for (auto p = begin(ia); p != end(ia); ++p)
	//g指向内层数组的首元素
	for (auto q = begin(*p); q!= end(*p); ++q)
		cout << *q;//输出q所指的整数值

类型别名简化多维数组的指针

读、写和理解一个指向多维数组的指针是复杂的工作,使用类型别名可以简化这项工作。

using int_array = int[4];
typedef int int_array[4]; // 等价
//输出ia中每个元素的值,每个内层数组各占一行
for (int_array *p = ia; p != ia + 3; ++p)
	for (int *q = *p; q != *p + 4; ++q)
		cout << *q;

程序将类型“4个整数组成的数组”命名为int_array,用类型名int_array 定义外层循环的控制变量让程序显得简洁明了。

相关推荐

  1. C# 数组

    2024-07-18 01:44:05       143 阅读
  2. 数组切片

    2024-07-18 01:44:05       28 阅读
  3. 实现数组扁平化

    2024-07-18 01:44:05       53 阅读
  4. 「PHP系列」PHP 数组详解

    2024-07-18 01:44:05       32 阅读
  5. C++ Primer:3.6 数组

    2024-07-18 01:44:05       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 01:44:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 01:44:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 01:44:05       58 阅读
  4. Python语言-面向对象

    2024-07-18 01:44:05       69 阅读

热门阅读

  1. 设计模式大白话之适配器模式

    2024-07-18 01:44:05       24 阅读
  2. C语言经典例题-19

    2024-07-18 01:44:05       19 阅读
  3. nvm的安装教程

    2024-07-18 01:44:05       20 阅读
  4. 人工智能前沿讲座——融合知识的自然语言处理

    2024-07-18 01:44:05       20 阅读
  5. centos7单机安装docker和k8s

    2024-07-18 01:44:05       22 阅读