我想创建类库,一个函数,其参数是一个未知大小的矩阵,用户将创建自己的矩阵并使用自己的大小,并将其传递给此函数,对其矩阵进行一些操作,如下所示,将是功能
calculateDeterminantOfTheMatrix( int matrix[][])
{
some Operations to do on matrix
}
答案 0 :(得分:14)
C和C ++的内置组件不能很好地支持多维数组。只有在编译时知道N
维度时,才能传递N-1
- 维数组:
calculateDeterminantOfTheMatrix( int matrix[][123])
但是,标准库提供了std::vector
容器,它对多维数组非常有效:在您的情况下,传递vector<vector<int> > &matrix
将是在C ++中处理任务的正确方法。 / p>
int calculateDeterminantOfTheMatrix(vector<vector<int> > &matrix) {
int res = 0;
for (int i = 0 ; i != matrix.size() ; i++)
for(int j = 0 ; j != matrix[i].size() ; j++)
res += matrix[i][j];
return res;
}
作为额外的奖励,您不需要将矩阵的维度传递给函数:matrix.size()
表示第一维,matrix[0].size()
表示第二维。
答案 1 :(得分:3)
C解决方案:
在C中,当作为函数参数传递时,你不能省略数组大小(除了最左边)。
你可以写: int a []
但不能: int a [] []
仅举例: int a [] [20]
这个约束在这里,因为编译器需要确定访问数组元素的正确偏移量。但是,你可以这样做:
void print_arbitrary_2D_array(void *arr, int y, int x)
{
/* cast to 2D array type */
double (*p_arr)[y][x] = (double (*)[y][x]) arr;
int i, j;
for (i = 0; i < y; ++i) {
for (j = 0; j < x; ++j)
printf(" %lf", (*p_arr)[i][j]);
putchar('\n');
}
}
double arr_1[4][3] = {
{ 3.3, 5.8, 2.3 },
{ 9.1, 3.2, 6.1 },
{ 1.2, 7.9, 9.4 },
{ 0.2, 9.5, 2.4 }
};
double arr_2[2][5] = {
{ 3.6, 1.4, 6.7, 0.1, 4.2 },
{ 8.4, 2.3, 5.9, 1.4, 8.3 }
};
print_arbitrary_2D_array(arr_1, 4, 3);
putchar('\n');
print_arbitrary_2D_array(arr_2, 2, 5);
答案 2 :(得分:1)
您可以采取多种方法。
C做事方式 - &gt;通过int**
,但在这里要非常谨慎。这不是一个二维数组。您必须正确地为此指针分配内存,或者,您需要在编译时知道大小。 (例如,静态分配大小为M * N的数组,然后禁止任何更大的数组)。为了动态分配内存,您需要知道行数和列数。
C ++方式 - &gt; #include <vector>
之后你可以简单地使用vector<vector<int> > &matrix
(小心<int>
之后的空格,除非你使用的是c ++ 11编译器。),它将分配一个int向量的向量,基本上是一个二维数组。在这种情况下,将为您处理内存管理。
答案 3 :(得分:1)
我会为矩阵编写一个简单的类包装器,其中定义了列和行。
template <typename T>
class Mat {
std::size_t _row;
std::size_t _col;
T *_mat_elem;
public:
Mat(std::size_t r, std::size_t c)
: _row(r), _col(c), _mat_elem(new T[r*c] {}
~Mat() {/* remember to do delete [] here */}
// element access, for example
T& at(std::size_t r, std::size_t c)
{
return *(_mat_elem+r*_col+c);
}
};
但实际上你正在重新发明轮子。那里有很好的矩阵处理库。
答案 4 :(得分:0)
使用此方法
声明一个指针数组
例如:int *a[n];
然后使用for循环为他们分配内存
例如:
for( int i=0 ; i<n ; i++ )
a[i] = new int[n];
现在像正常数组一样传递参数。 例如:print_array(a,n); 而print_array函数看起来像
print_array(int **a,int n)//the prototype for the print_array
{
//access the array using index such as
std:: cout<<a[1][1]<<endl;
}
以上情况是nxn数组的情况,如果需要mxn 像这样分配内存
for( int i=0 ; i<m ; i++ )
a[i] = new int[n];
然后将m,n和都传递给函数,并在for循环中访问数组。
答案 5 :(得分:0)
到目前为止,我发现的在函数中使用2D数组的最佳方法是使用Mapping Function。如下例所示,我使用了映射功能来打印2D数组
void Print2D(int x[],int ROWS,int COLS)
{
for(int i=0;i<ROWS;i++)
{
for(int j=0;j<COLS;j++)
cout << x[i*COLS+j] << ' ';
cout << endl;
}
}
这里是如何在main中使用它
int main(){
int x[3][3];
Print2D(&x[0],3,3);
}
&x [0]是2D数组第一行的起始地址,或更准确地说是2D数组的起始地址