C++ では、次のようなことをしたいと思います。
int n = get_int_from_user();
char* matrix = new char[n][n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
delete [][] matrix;
もちろん、これは機能しません。同様のことを行う最良の方法は何ですか? これに対するいくつかの解決策を見てきましたが、かなり面倒です。
C++ では、次のようなことをしたいと思います。
int n = get_int_from_user();
char* matrix = new char[n][n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
delete [][] matrix;
もちろん、これは機能しません。同様のことを行う最良の方法は何ですか? これに対するいくつかの解決策を見てきましたが、かなり面倒です。
手動の動的な方法:
width*height の配列が必要だとしましょう。最も効率的な方法は、1 次元配列を使用することです。
char *matrix = new char[width*height];
削除するには:
delete[] matrix;
アクセスするには:
char getArrayValue(char *matrix, int row, int col)
{
return matrix[row + col*width];
}
変更するには:
void setArrayValue(char *matrix, int row, int col, char val)
{
matrix[row + col*width] = val;
}
ブースト マトリックス:
依存関係がある場合は、boost::matrix の使用を検討してください。
次に、ブースト線形代数ライブラリに結び付けることができます。
#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
matrix<char> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
for (unsigned j = 0; j < m.size2 (); ++ j)
m (i, j) = 3 * i + j;
一部のコンパイラのスタック:
一部のコンパイラでは、実行時に決定されたサイズでスタック上に配列を作成できます。g++ はそのようなコンパイラの例です。ただし、デフォルトの VC++ ではこれを行うことはできません。
したがって、g++ ではこれは有効なコードです。
int width = 10;
int height = 10;
int matrix[width][height];
Drew Hall は、この C99 機能は可変長配列 (VLA) と呼ばれ、おそらく最新のコンパイラでオンにできると述べました。
私は通常、次のようなことをします:
char *matrix = new char [width * height];
matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';
delete [] matrix;
あなたはC ++(C with classes)の要点全体を見逃しているようです:-)。これは、クラスがそれを実装することを叫んでいる種類の使用法です。
あなたが探しているデータ構造を持っていると確信しているSTLまたは他のサードパーティのクラスライブラリを使用することもできますが、独自のものを作成する必要がある場合は、次のプロパティを持つクラスを作成してください。
どうstd::vector< std::vector<int> > array2d;
ですか?
真の 2 次元配列の場合:
int n = get_int_from_user();
char** matrix = new char*[n];
for (int i = 0; i < n; i++) {
matrix[i] = new char[n];
}
// Operations on matrix.
for (int i = 0; i < n; i++) {
delete [] matrix[i];
}
delete matrix;
頭のてっぺんから。間違い、間違いありません。ただし、他の人がよりエレガントなアプローチを投稿していると思います。
幅を個別に追跡する必要がないように、データメンバーをクラスにラップする拡張機能を備えた 1 次元配列アプローチ (Brian R. Bondy によって選択された回答) が好きです。
class Matrix
{
int width;
int height;
char* data;
public:
Matrix();
Matrix(int width, int height);
~Matrix();
char getArrayValue(int row, int col);
void setArrayValue(int row, int col, char val);
}
実装は読者の演習です。;)
これでいいと思います。
int n = get_int_from_user();
char **matrix=new (char*)[n];
for(int i=0;i<n;i++)
matrix[i]=new char[n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
for(int i=0;i<n;i++)
delete []matrix;
delete []matrix;
std::vector<int> m;
次に、実行時に m.resize() を呼び出します。
int* matrix = new int[w*h];
ガウス消去法のようなことをしたい場合、マトリックスは
int** matrix = new int*[h];
for(size_t i(0); i < h; ++i)
matrix[i] = new int[w];
(ガウス消去法では、通常、ある行を別の行と交換する必要があるため、線形時間でコピーして交換するよりも、一定時間で行へのポインターを交換する方が適切です)。