2021.1.14
第三章
3.6多维数组(112)
按照由内到外的顺序阅读有助于更好地理解其多维数组的真实含义。
对于二维数组来说,常把第一个维度称为行,第二个维度称为列。
*多维数组的初始化
可以用一维数组的方式初始化多维数组,如:
int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
每一行分别用花括号括起来,当然并非必需的。若内嵌层没有使用花括号,
则表示依次完成每个元素,总是从第一个元素开始。
*多维数组的下标引用
int ia[3][4];
int arr[10][20][30] = {0};
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1]; // 把row定义为一个含有4个 整数的数组的引用。把row绑定到ia的第二个4元素数组上。
eg:程序中经常会 用到两层嵌套的for循环来处理多维数组的元素:
constexpr size_t rowCnt = 3, colCnt = 4;
*使用范围for语句处理多维数组:
c++11新标准新增范围for语句:
size_t cnt = 0;
for(auto &row : ia) // 对应于外层数组的每一个元素
for (auto &col : row) { // 对应于内层数组的每一个元素
col = cnt;
++cnt;
}
因为要改变数组内容,所以使用引用.如改成:
size_t cnt = 0;
for(auto row : ia) // 对应于外层数组的每一个元素
for (auto col : row) { // 对应于内层数组的每一个元素
col = cnt;
++cnt;
}
此时编译器为将row的类型转化为指向该数组内首元素的指针。这样row的类型
为int *;显然内层循环不合法。
NOTE:使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。
*指针和多维数组
定义指向多维数组的指针时,千万别忘记这个多维数组实际上是数组的数组。
因为多维数组实际上是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针。
使用C++11的auto后decltype就可避免在数组前面加上一个指针类型。
int ia[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组
int (*p)[4] = ia; // p指向含有4个整数的数组
p = &ia[2]; // p 指向ia的尾元素
for (auto p = ia; p != ia + 3; ++p)
for (auto q = *p; q != *p + 4; ++q)
cout << *q << ' ';
cout << endl;
for (auto p = begin(ia); p != end(ia); ++p)
for (auto q = begin(*p); q != end(*p); ++q)
cout << *q << ' ';
cout << endl;
#include <iostream>
using namespace std;
void test_multi_array()
{
cout << endl;
cout << "Test_multi_array with three print for ia array." << endl;
constexpr int row = 3, col = 4;
int ia[row][col] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
cout << "The first: "; // 使用引用更加高效,利用范围for,进行遍历
for (int (&p)[col] : ia) // 元素为容量为col的数组,元素类型为int
for (int &q : p)
cout << q << ' ';
cout << endl;
cout << "The second: ";
for (size_t i = 0; i < row; i++) // 下标
for (size_t j = 0; j < col; j++)
cout << ia[i][j] << ' ';
cout << endl;
cout << "The third: ";
for (int(*p)[col] = ia; p != ia + row; ++p) // 迭代器
for (int *q = (*p); q != *p + col; ++q)
cout << *q << ' ';
cout << endl;
}