當前位置:首頁 > IT技術(shù) > 編程語言 > 正文

C++_Primer_2021.11.14
2021-11-16 11:36:30

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/

開通會員,享受整站包年服務(wù)立即開通 >