C++/Qt遍歷多維數(shù)組的3種方式示例
一、什么是多維數(shù)組
想要遍歷多維數(shù)組,就得知道什么是多維數(shù)組。
嚴(yán)格來(lái)說(shuō),C++語(yǔ)言中沒(méi)有多維數(shù)組,通常所說(shuō)的多維數(shù)組其實(shí)是數(shù)組的數(shù)組。謹(jǐn)記這一點(diǎn),對(duì)今后理解和使用多維數(shù)組大有益處。
當(dāng)一個(gè)數(shù)組的元素仍然是數(shù)組時(shí),通常使用兩個(gè)維度來(lái)定義它:一個(gè)維度表示數(shù)組本身大小,另外一個(gè)維度表示其元素(也是數(shù)組)大?。?/p>
int ia[3][4]; // 大小為3的數(shù)組,每個(gè)元素是含有4個(gè)int的數(shù)組 // 大小為10的數(shù)組,它的每個(gè)元素都是大小為20的數(shù)組 // 這些數(shù)組的元素是含有30個(gè)double的數(shù)組 double db[10][20][30] = {0}; // 將所有元素初始化為0
二、遍歷多維數(shù)組
先來(lái)定義一個(gè)多維數(shù)組:
// dobuleArrMulti是個(gè)大小為2的數(shù)組,它的每個(gè)元素都是大小為3的數(shù)組 // 這些數(shù)組的元素是含有4個(gè)double的數(shù)組 double doubleArrMulti[2][3][4] = { { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }, { {12,13,14,15}, {16,17,18,19}, {20,21,22,23} } };
2.1 使用范圍for語(yǔ)句處理多維數(shù)組
要使用范圍for語(yǔ)句處理多維數(shù)組,除了最內(nèi)層的循環(huán)外,其他所有循環(huán)的控制變量都應(yīng)該是引用類型:
// 使用范圍for語(yǔ)句處理多維數(shù)組 for(auto &arr : doubleArrMulti) // 對(duì)于最外層數(shù)組的每一個(gè)元素 for(auto &arow : arr) // 對(duì)于次外層數(shù)組的每一個(gè)元素 for(auto acol : arow) // 對(duì)于內(nèi)層數(shù)組的每一個(gè)元素 qDebug() << "范圍for遍歷:" + QString::number(acol); // 打印
2.2 使用指針遍歷多維數(shù)組
因?yàn)槎嗑S數(shù)組實(shí)際上是數(shù)組的數(shù)組,所以由多維數(shù)組名轉(zhuǎn)換得來(lái)的指針實(shí)際上是指向第一個(gè)內(nèi)層數(shù)組的指針:
int ia[3][4]; // 大小為3的數(shù)組,每個(gè)元素是含有4個(gè)int的數(shù)組 int (*p)[4] = ia; // p指向含有4個(gè)int的數(shù)組 p = &ia[2]; // p指向ia的尾元素
隨著C++11新標(biāo)準(zhǔn)的提出,通過(guò)使用auto或者decltype就能盡可能地避免在數(shù)組前面加上一個(gè)指針類型了:
// 使用指針遍歷多維數(shù)組 for(auto arr = doubleArrMulti; arr != doubleArrMulti+2; ++arr) // arr指向最外層數(shù)組首元素 for(auto arow = *arr; arow != *arr+3; ++arow) // arow指向次外層數(shù)組首元素 for(auto acol = *arow; acol!= *arow+4; ++acol) // acol指向內(nèi)層數(shù)組首元素 qDebug() << "指針遍歷:" + QString::number(*acol); // 打印
當(dāng)然,使用標(biāo)準(zhǔn)庫(kù)函數(shù)begin和end也能實(shí)現(xiàn)同樣的功能,而且看起來(lái)更簡(jiǎn)潔一些:
// 使用指針遍歷多維數(shù)組 for(auto arr = std::begin(doubleArrMulti); arr != std::end(doubleArrMulti); ++arr) for(auto arow = std::begin(*arr); arow != std::end(*arr); ++arow) for(auto acol = std::begin(*arow); acol!= std::end(*arow); ++acol) qDebug() << "指針遍歷1:" + QString::number(*acol);
2.3 使用類型別名遍歷多維數(shù)組
類型別名簡(jiǎn)化多維數(shù)組的指針讀、寫(xiě)和理解一個(gè)指向多維數(shù)組的指針是一個(gè)讓人不勝其煩的工作,使用類型別名能讓這項(xiàng)工作變得簡(jiǎn)單一點(diǎn)兒,例如:
using double_array1 = double[3][4]; // 新標(biāo)準(zhǔn)下的使用using的類型別名聲明 typedef double double_array2[4]; // 等價(jià)的使用typedef的類型別名聲明 for(double_array1 *da1 = doubleArrMulti; da1 != doubleArrMulti+2; ++da1) for(double_array2 *da2 = *da1; da2 != *da1+3; ++da2) for(double *d = *da2; d != *da2+4; ++d) qDebug() << "類型別名遍歷:"+QString::number(*d);
附:多維數(shù)組初始化
int arr[2][3],一般在函數(shù)體中使用,所以是在棧中分配內(nèi)存的局部變量,未初始化時(shí)內(nèi)存上存的是0xCCCCCCCC,它的補(bǔ)碼數(shù)即為-858993460。 int arr[2][3] = {0},為第一個(gè)元素賦值為0,其余元素由于沒(méi)給值,所以也賦值為0. int arr[2][3] = {1},為第一個(gè)元素賦值為1,其余元素由于沒(méi)給值,所以賦值為0. int arr[2][3] = {1,2,3,4},為前4個(gè)元素依次賦值為這些。(相當(dāng)于把所有元素展開(kāi)來(lái)數(shù)前4個(gè))其余為0. int arr[2][3] = { {1}, {2} },為每一行的首元素賦值。注意里面大括號(hào)的個(gè)數(shù)不能大于第一維度的大小。其余為0. int arr[2][3] = { {1,2,3}, {4,5,6} },這是最完整的賦值。
總結(jié)
到此這篇關(guān)于C++/Qt遍歷多維數(shù)組的3種方式的文章就介紹到這了,更多相關(guān)C++ Qt遍歷多維數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Libmicrohttpd搭建內(nèi)嵌(本地)服務(wù)器的方法
下面小編就為大家?guī)?lái)一篇使用Libmicrohttpd搭建內(nèi)嵌(本地)服務(wù)器的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08C 語(yǔ)言基礎(chǔ)之C語(yǔ)言的常見(jiàn)關(guān)鍵字
C語(yǔ)言中有一些預(yù)先定義的字符串,他們本身被賦予了自身的功能。并且我們?cè)诙x變量的時(shí)候,不能去搶他們的名字來(lái)用。他們就是今天的主角:關(guān)鍵字,下面文章將給大家做詳細(xì)介紹2021-09-09C++使用chrono庫(kù)處理日期和時(shí)間的實(shí)現(xiàn)方法
C++11 中提供了日期和時(shí)間相關(guān)的庫(kù) chrono,通過(guò) chrono 庫(kù)可以很方便地處理日期和時(shí)間,本文主要介紹了C++使用chrono庫(kù)處理日期和時(shí)間的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2021-09-09C++文件的數(shù)據(jù)寫(xiě)入和文件的數(shù)據(jù)讀取的方法實(shí)現(xiàn)
本文主要介紹了C++文件的數(shù)據(jù)寫(xiě)入和文件的數(shù)據(jù)讀取的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C語(yǔ)言動(dòng)態(tài)內(nèi)存分配圖文講解
給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過(guò)這樣的疑問(wèn)。這一期就來(lái)聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解2023-01-01VSCode插件開(kāi)發(fā)全攻略之package.json詳解
這篇文章主要介紹了VSCode插件開(kāi)發(fā)全攻略之package.json的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05