次の 2 種類の配列宣言を考えてみましょう。
T x [rows * cols]; // type 1
T y [rows][cols]; // type 2
私は通常、最初のタイプ (タイプ 1) を使用し、x[row * cols + col] を使用してインデックスを作成することを知っています。
ただし、2 次元配列をシミュレートする 1 次元配列に 2 次元配列をコピーしたい場合、つまり、type2 をコピー -> type1 とします。これらがメモリ内で同じように配置されることが保証されている場合、一方から他方へ memcpy を実行できますか? 現在、私はそのようなループを持っていますが、メモリが両方で同じレイアウトである場合、memcpy を実行できると考えています。以下のパブリック コンストラクターを検討してください。
public:
// construct a matrix from a 2d array
template <unsigned int N, unsigned int M>
Matrix ( T (&twoDArray)[N][M] ) : rows_(N), cols_(M), matrixData_(new T[rows_*cols_])
{
// is there a refactor here? Maybe to memcpy?
for ( unsigned int i = 0; i < rows_ ; ++i )
{
for ( unsigned int j = 0; j < cols_ ; ++j )
{
matrixData_[ i * cols_ + j ] = twoDArray[i][j];
}
}
}
private:
unsigned int rows_;
unsigned int cols_;
T* matrixData_;