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