C++中使用模板完成对二维数组的通用访问

来源:互联网 发布:百度阿波罗 知乎 编辑:程序博客网 时间:2024/05/18 02:51

    定义一个二维数组,例如:

   

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*。例如:

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);}
    还有一种更直观的做法,是使用C++的模板。例如:

   

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);}


0 0
原创粉丝点击