2012-11-12 69 views
0

我需要做这个功能。该参数假设是一个随机的N*N数组。它应该返回一个(N-1)*(N-1)数组。我怎样才能做到这一点?如何使一个函数返回一个二维数组在c + +中

int** SubMatrix(int** matrix){ 
    int** submatrix=new int*[size-1]; 
     ................................ 
     ................................ 
     return submatrix; 
} 

此编码是正确的?

此外,说,在主函数中,我已经有这个数组

x={{1,2,3},{1,2,3},{1,2,3}}; 

如何调用该函数?

呼叫:

int y[2][2]=SubMatrix[x] 

是错误的,

int** y=SubMatrix[x] 

也是错误的......

+2

是N已知常数,或者可以在运行时改变?换句话说,它是否必须处理任何大小的输入数组? – davec

+2

你应该看看C++的基本语法。一个函数应该像'int ** y = SubMatrix(x)'调用一样。 – kosklain

+0

函数签名是否固定?如果您可以更改该签名,则有更好的方法来执行此操作。 – Yakk

回答

0

首先,有没有办法来跟踪数组的大小在C++(只分配的内存量)。所以,数组的size必须作为参数传递或是全局的。我做这样的假设在以下声明:

int* SubMatrix(int** matrix, int size){ 
    int* submatrix = new int[(size - 1) * (size - 1)]; 
    // Do stuff 
    return submatrix; 
} 

第二,如果你的矩阵是方形的,可能是更好的使用上面那些数组分配的大小是(N-1)*(N-1)描述的声明(见凯文Loney的答案How do I declare a 2d array in C++ using new?关于矩阵堆上的声明);因此,该阵列可作为矩阵访问。访问单元将,但是,需要一个位算术的:

for (int i = 0; i < size - 1; ++i) 
    for (int j = 0; j < size - 1; ++j) 
     submatrix[i * (size -1) + j] // Element at [i][j] 

最后,由该函数返回的数组现在是一个矩阵指针:

int* matrix = SubMatrix(matrix, size); 

返回的矩阵的尺寸是(size-1)*(size-1)

关于你比如现在:

x = {{1,2,3},{1,2,3},{1,2,3}}; 
int* y = SubMatrix(matrix, 3); 
// y is now a matrix of size (size-1)*(size-1) 

如果你真的(真的)需要一个二维数组:

int** SubMatrix(int** matrix, int size){ 
    int** submatrix = new int*[size - 1]; 
    for (int i = 0; i < size - 1; ++i) 
     submatrix[i] = new int[size - 1] 
    // Do stuff 
    return submatrix; 
} 
+0

但这种方式返回是一维数组吗?有什么办法可以让它变成二维吗? – user1819047

+0

当然,但不一定是“二维”的。相反,它被称为“锯齿”,因为你有一个数组指针可能是任意大小的数组。我已将代码附加到我的答案中。 –

相关问题