2021.1.14
第三章
3.6多維數(shù)組(112)
按照由內(nèi)到外的順序閱讀有助于更好地理解其多維數(shù)組的真實含義。
對于二維數(shù)組來說,常把第一個維度稱為行,第二個維度稱為列。
*多維數(shù)組的初始化
可以用一維數(shù)組的方式初始化多維數(shù)組,如:
int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
每一行分別用花括號括起來,當然并非必需的。若內(nèi)嵌層沒有使用花括號,
則表示依次完成每個元素,總是從第一個元素開始。
*多維數(shù)組的下標引用
int ia[3][4];
int arr[10][20][30] = {0};
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1]; // 把row定義為一個含有4個 整數(shù)的數(shù)組的引用。把row綁定到ia的第二個4元素數(shù)組上。
eg:程序中經(jīng)常會 用到兩層嵌套的for循環(huán)來處理多維數(shù)組的元素:
constexpr size_t rowCnt = 3, colCnt = 4;
*使用范圍for語句處理多維數(shù)組:
c++11新標準新增范圍for語句:
size_t cnt = 0;
for(auto &row : ia) // 對應(yīng)于外層數(shù)組的每一個元素
for (auto &col : row) { // 對應(yīng)于內(nèi)層數(shù)組的每一個元素
col = cnt;
++cnt;
}
因為要改變數(shù)組內(nèi)容,所以使用引用.如改成:
size_t cnt = 0;
for(auto row : ia) // 對應(yīng)于外層數(shù)組的每一個元素
for (auto col : row) { // 對應(yīng)于內(nèi)層數(shù)組的每一個元素
col = cnt;
++cnt;
}
此時編譯器為將row的類型轉(zhuǎn)化為指向該數(shù)組內(nèi)首元素的指針。這樣row的類型
為int *;顯然內(nèi)層循環(huán)不合法。
NOTE:使用范圍for語句處理多維數(shù)組,除了最內(nèi)層的循環(huán)外,其他所有循環(huán)的控制變量都應(yīng)該是引用類型。
*指針和多維數(shù)組
定義指向多維數(shù)組的指針時,千萬別忘記這個多維數(shù)組實際上是數(shù)組的數(shù)組。
因為多維數(shù)組實際上是數(shù)組的數(shù)組,所以由多維數(shù)組名轉(zhuǎn)換得來的指針實際上是指向第一個內(nèi)層數(shù)組的指針。
使用C++11的auto后decltype就可避免在數(shù)組前面加上一個指針類型。
int ia[3][4]; // 大小為3的數(shù)組,每個元素是含有4個整數(shù)的數(shù)組
int (*p)[4] = ia; // p指向含有4個整數(shù)的數(shù)組
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的數(shù)組,元素類型為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;
}
本文摘自 :https://www.cnblogs.com/