C 過載二維陣列下標

2021-06-21 00:24:48 字數 1884 閱讀 1183

寫在文章開頭的話

(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];

至於更高維數的陣列,也是這樣看,比如如下的三維陣列,可以採用下面的方式來定義。

int array[3][4][5];

typedef int t1[5];

typedef t1 t2[4];

t2 array[3];

由於實際中二維陣列用的較多,所以,下面主要是練習二維陣列的下標過載。那過載二維陣列的下標有什麼好處呢?最大的好處就在於可以使**簡潔直觀。

我在網上也看到過一些別人的實現方法,其中在 文章(

中就提到了一種過載方法,使用一維陣列來表示二維陣列,這是大多數的實現方法,但是其實現過程過於複雜,其構建了兩個類,分別用來獲取行和列,然後計算出指定的二維下標對應的內部一維陣列的值並返回。

下面介紹我自己寫過載二維下標實現方式,不一定最好,但比上面提到的方式要好。

2. 過載固定維數的二維陣列下標

對於固定維數的二維陣列下標過載,一般在像3d圖形方面經常涉及到一些平移轉換矩陣時用到,這裡以 4 * 4 的矩陣為例,實現**如下:

struct matrix4f

};

測試賦值和取值操作,均正常:

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. 過載維數可變的二維陣列下標

對於可變的二維陣列下標過載,在陣列初始化時指定維數,之後可以像一般的二維陣列進行賦值和取值操作,採用模板實現,**如下:

template class matrix

~matrix()

}// 返回二維陣列的第 k 行位址

t * operator(int k)

private:

int m_row;

int m_col;

t *m_data;

};

測試賦值和取值操作:

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...