1. 程式人生 > >C++中使用模板完成對二維陣列的通用訪問

C++中使用模板完成對二維陣列的通用訪問

    定義一個二維陣列,例如:

   

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