C++中使用模板完成對二維陣列的通用訪問
阿新 • • 發佈:2018-11-22
定義一個二維陣列,例如:
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
要用指標的形式訪問它,需要這麼使用:
int (*p)[3] = a;
若要將一個二維陣列當作引數傳遞給一個函式,則函式的引數需要是一個“指向陣列的指標”,而且需要指定第二維的大小。例如:
void PrintMatrix(int (*p)[3], int rowNum) { for (int i = 0; i < rowNum; i++) { for (int j = 0; j < 3; j++) { cout<< p[i][j] << "\t"; } cout<< "\n"; } } int main(void) { int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; PrintMatrix(a, 2); }
但是現在又有一個二維陣列b[3][4],就不能直接呼叫PrintMatrix(b, 3),因為它的第二維大小是4。
若想寫一個通用的函式,以矩陣的形式列印二維陣列,可以將二維陣列強制轉換為普通的一維指標int*。例如:
還有一種更直觀的做法,是使用C++的模板。例如:void PrintMatrix(int* p, int rowNum, int colNum) { for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { cout<< *(p + colNum * i + j) << "\t"; } cout<< "\n"; } } int main(void) { int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; PrintMatrix(&a[0][0], 2, 3); int b[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; PrintMatrix(&b[0][0], 3, 4); }
template<class T> void PrintMatrix(T a[], int rowNum, int colNum) { for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { cout<<a[i][j] << "\t"; } cout<< "\n"; } } int main(void) { int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; PrintMatrix(a, 2, 3); int b[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; PrintMatrix(b, 3, 4); }