C++ でコーディングを始めてからわずか 15 日間ですが、行き詰まる問題に遭遇しました。目的を達成するには、動的な 2 次元配列を使用する必要があります。std::vector を使用して 1 次元の動的配列を作成していますが、2 次元の動的配列を作成する方法がわかりません。役立つ場合は VC++ を使用していますが、VC++ ライブラリ関数は使用していません。
誰もそれを成し遂げる方法を知っていますか?
C++ でコーディングを始めてからわずか 15 日間ですが、行き詰まる問題に遭遇しました。目的を達成するには、動的な 2 次元配列を使用する必要があります。std::vector を使用して 1 次元の動的配列を作成していますが、2 次元の動的配列を作成する方法がわかりません。役立つ場合は VC++ を使用していますが、VC++ ライブラリ関数は使用していません。
誰もそれを成し遂げる方法を知っていますか?
ネストされたベクトルでそれを行うことができます:
int number_of_rows, number_of_columns;
std::vector < std::vector <int> > array;
array.resize(number_of_rows);
for (int i=0; i < number_of_rows; ++i)
array[i].resize(number_of_columns);
array[1][2] = 3; // e.g. of assignment
コンストラクターで完全な配列サイズを初期化する:
std::vector <std::vector <int> > (nor, std::vector<int>(noc));
ただし、ネストされたstd::vector
構造は 2 次元配列にバインドされないことに注意してください。ネストされたベクトルはそれぞれ異なるサイズを持つことができます。例えば:
std::vector <std::vector <int> > not_array(3);
// contains 3 inner empty vectors
for (int i=0; i < 3; ++i)
arrray[i].resize(i+1);
これで、not_array
サイズが1、2、3のベクトルがこの順序で含まれるようになりました。
(1D)ベクトルのベクトルだけでなく、行列(2D)を使用していることを確認したい場合は、外部ライブラリからの実装を使用できます。
OpenCV
はコンピュータ ビジョン ライブラリであり、クラスが含まれていますcv::Mat
boost
汎用ライブラリであり、matrix
クラスの実装があります配列の次元が可変である場合 (たとえば、各行の長さが異なる場合)は、適切な解決策です (特定の要素タイプに vector<vector<int> >
置き換えます)。int
各行の長さが同じ場合でもこのアプローチを使用できますが、このプロパティを確保するには、より多くの作業が必要になる場合があります。後者の場合、何らかのMatrix
タイプをサポートするライブラリを見つけたほうがよいかもしれません。
C++/STL 標準ライブラリには、2 次元のデータ構造はありません。
他の人が言ったように、vector
. ただし、全体の構造の一貫性を保証するものではありません。(行列の 2 行が同じ長さであるとは限りません)。
これをオブジェクト内にカプセル化して、正しいマトリックス構造を強制する必要があります。または、既存の Matrix データ構造を使用することもできます。それを提供するライブラリはたくさんあると思います。
2 次元配列はベクトルのベクトルです。例を参照してください。
// Declare size of two dimensional array and initialize.
vector< vector<int> > vI2Matrix(3, vector<int>(2,0));
vI2Matrix[0][0] = 0;
vI2Matrix[0][1] = 1;
vI2Matrix[1][0] = 10;
vI2Matrix[1][1] = 11;
vI2Matrix[2][0] = 20;
vI2Matrix[2][1] = 21;
cout << "Loop by index:" << endl;
int ii, jj;
for(ii=0; ii < 3; ii++)
{
for(jj=0; jj < 2; jj++)
{
cout << vI2Matrix[ii][jj] << endl;
}
}