パラメータが未知のサイズの行列である関数であるクラスライブラリを作成したいのですが、ユーザーは自分のサイズで独自の行列を作成し、それをこの関数に渡して、このような行列に対していくつかの操作を実行します。関数
calculateDeterminantOfTheMatrix( int matrix[][])
{
some Operations to do on matrix
}
多次元配列は、C および C++ の組み込みコンポーネントではあまりサポートされていません。N
-dimension 配列を渡すことができるのはN-1
、コンパイル時に次元がわかっている場合のみです。
calculateDeterminantOfTheMatrix( int matrix[][123])
ただし、標準ライブラリはstd::vector
、多次元配列に対して非常にうまく機能するコンテナーを提供します。あなたの場合、vector<vector<int> > &matrix
C++ でタスクを処理する適切な方法は、渡すことです。
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()
表し、2 番目の次元を表します。
列と行が定義されたマトリックスの単純なクラスラッパーを作成します。
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);
}
};
しかし実際には、あなたは車輪を再発明しています。そこにマトリックス処理のための良いライブラリがあります。
あなたが取ることができる複数のアプローチがあります。
C のやり方 -> a を渡しint**
ますが、ここでは非常に注意してください。これは 2D 配列ではありません。このポインタにメモリを正しく割り当てるか、コンパイル時にサイズを知る必要があります。(たとえば、サイズ M * N の配列を静的に割り当ててから、それより大きいものは許可しません)。メモリを動的に割り当てるには、行と列の数を知る必要があります。
C++ の方法 ->#include <vector>
その後、単純に使用できますvector<vector<int> > &matrix
(C++11 コンパイラを使用していない限り、後のスペースに注意して<int>
ください)。これにより、基本的に 2 次元配列である int ベクトルのベクトルが割り当てられます。この場合、メモリ管理が行われます。