寫在文章開頭的話
(1)乙個多維陣列是如何工作的
(2)如何過載二維陣列下標
1. 分析
過載一維陣列下標很簡單,通過下標傳入的索引值,返回內部陣列中相應的值。那過載二維陣列的下標運算呢?
其實過載二維和一維本質是一樣的,因為 c/c++ 中所謂的 「二維或多維陣列」都是由簡單的一維陣列表示的。舉個例子哈:
下面是兩個 int 陣列,第(1)個是熟悉的一維陣列,第(2)個是熟悉的二維陣列,現在你要做的就是將第(2)個陣列看成是乙個一維陣列。
(1)int array[3];
(2)int array[3][4];
怎麼看?可以在頭腦中將第(2)個陣列陣列看成如下定義的方式, 陣列 array 包含 3 個元素,其中每個元素又都是乙個陣列型別(或者說是乙個指標型別)。
typedef int t[4];
t array[3];
至於更高維數的陣列,也是這樣看,比如如下的三維陣列,可以採用下面的方式來定義。
[cpp] view plain copy
int array[3][4][5];
typedef int t1[5];
typedef t1 t2[4];
t2 array[3];
由於實際中二維陣列用的較多,所以,下面主要是練習二維陣列的下標過載。那過載二維陣列的下標有什麼好處呢?最大的好處就在於可以使**簡潔直觀。
我在網上也看到過一些別人的實現方法,其中在 文章(中就提到了一種過載方法,使用一維陣列來表示二維陣列,這是大多數的實現方法,但是其實現過程過於複雜,其構建了兩個類,分別用來獲取行和列,然後計算出指定的二維下標對應的內部一維陣列的值並返回。
下面介紹我自己寫過載二維下標實現方式,不一定最好,但比上面提到的方式要好。
2. 過載固定維數的二維陣列下標
對於固定維數的二維陣列下標過載,一般在像3d圖形方面經常涉及到一些平移轉換矩陣時用到,這裡以 4 * 4 的矩陣為例,實現**如下:
[cpp] view plain copy
struct matrix4f
};
測試賦值和取值操作,均正常:
[cpp] view plain copy
matrix4f m;
m[0][0] = 1.0f;
m[1][1] = 9.9f;
cout << m[0][0] << endl; // 1
cout << m[1][1] << endl; // 9.9
3. 過載維數可變的二維陣列下標
對於可變的二維陣列下標過載,在陣列初始化時指定維數,之後可以像一般的二維陣列進行賦值和取值操作,採用模板實現,**如下:
[cpp] view plain copy
template
class matrix
~matrix()
} // 返回二維陣列的第 k 行位址
t * operator(int k)
private:
int m_row;
int m_col;
t *m_data;
};
測試賦值和取值操作:
[cpp] view plain copy
matrixm2(3, 4);
m2[0][0] = 2;
m2[2][3] = 9;
cout << m2[0][0] << endl; // 2
cout << m2[2][3] << endl; // 9
和一般的二維陣列一樣沒有越界檢查,所以越界操作也是可以的,但是盡量使用前檢查索引是否越界,以免引發未知錯誤。
C 過載二維陣列下標
寫在文章開頭的話 1 乙個多維陣列是如何工作的 2 如何過載二維陣列下標 1.分析 過載一維陣列下標很簡單,通過下標傳入的索引值,返回內部陣列中相應的值。那過載二維陣列的下標運算呢?其實過載二維和一維本質是一樣的,因為 c c 中所謂的 二維或多維陣列 都是由簡單的一維陣列表示的。舉個例子哈 下面是...
過載二維陣列下標
解決辦法 1 可變長陣列 對於可變的二維陣列下標過載,在陣列初始化時指定維數,之後可以像一般的二維陣列進行賦值和取值操作.當然,使用模板template來實現更好 1 class array2d 12array2d 1314 array2d 1718 int operator const int i...
C 二維陣列
c 二維陣列 微學苑 具有兩個下標的陣列稱為二維陣列。有些資料要依賴於兩個因素才能惟一地確定,例如有3個學生,每個學生有4門課的成績,顯然,成績資料是乙個二維表,如書中表5.1所示。表5.1 學生成績資料表 學生序號 課程1課程2 課程3課程4 課程5學生1 8578 9996 88學生2 7689...