web-dev-qa-db-ja.com

多次元ベクトル

2Dベクトルを作成するにはどうすればよいですか? 2D配列では、次のように表現できることを知っています。

a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;

a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;

C++ STL Vectorを使用してこれをどのように行うことができますか?

30
karthigeyan

vector<vector<int> > a;

行と列を定義する場合、

vector<vector<int> > a{{11, 2, 4}, {4, 5, 6}, {10, 8, -12}};

32
Ari
std::vector< std::vector< int > > a; // as Ari pointed

システムがすべての内部ベクトルが同じサイズであることを保証しないため、成長するマトリックスにこれを使用すると複雑になる可能性があります。 2番目の次元で成長するたびに、すべてのベクトルを明示的に成長させる必要があります。

// grow twice in the first dimension
a.Push_back( vector<int>() );
a.Push_back( vector<int>() );

a[0].Push_back( 5 ); // a[0].size() == 1, a[1].size()==0

それで問題なければ(実際には行列ではなく、ベクトルのベクトルです)、問題ないはずです。そうでない場合は、2番目の次元がすべてのベクトルにわたって安定するように特に注意する必要があります。

固定サイズのマトリックスを計画している場合は、二重配列構文を提供する代わりに、クラスにカプセル化し、operator()をオーバーライドすることを検討する必要があります。 C++を読むFAQこれに関して こちら

std::vector< std::vector<int> > a;

    //m * n is the size of the matrix

    int m = 2, n = 4;
    //Grow rows by m
    a.resize(m);
    for(int i = 0 ; i < m ; ++i)
    {
        //Grow Columns by n
        a[i].resize(n);
    }
    //Now you have matrix m*n with default values

    //you can use the Matrix, now
    a[1][0]=98;
    a[1][1]=989;
    a[1][2]=981;
    a[1][3]=987;

//OR
for(i = 0 ; i < m ; ++i)
{
    for(int j = 0 ; j < n ; ++j)
    {      //modify matrix
        int x = a[i][j];
    }

}
13
aJ.

ベクトルを使用するhaveを使用しない場合は、 Boost.Multi_array を試してください。 リンク は短い例です。

6
Benoît

たとえば、5行3列のマトリックスの宣言:

vector<vector<int> > new_matrix(5,vector<int>(3));

上記と同じ結果を得るための別の宣言方法:

vector<int> Row;    

行列の1行:

vector<Row> My_matrix;

My_matrixは行のベクトルです。

My_matrix new_matrix(5,Row(3)); 
2
IluxaKuk

アリが指摘したように、vector< vector< int>>はそれを行う正しい方法です。

それに加えて、このような場合、複雑なSTL構造は不器用で混乱しやすい傾向があるため、クラスでの内部ベクトル(実際には、それが表すもの)のラップを常に検討します。

0
Igor Oks

2Dベクトルを使用するには、次の方法を使用します。

int rows, columns;        

// . . .

vector < vector < int > > Matrix(rows, vector< int >(columns,0));

                                  Or

vector < vector < int > > Matrix;
Matrix.assign(rows, vector < int >(columns, 0));

// Do your stuff here...

これにより、サイズ行*列のマトリックスが作成され、コンストラクターの2番目の引数としてzero(0)が渡されるため、ゼロで初期化されます。つまり、ベクター<int>(columns、0)。

0
Aditya Goel

dribeasの提案は、本当に進むべき道です。

Operator()ルートを使用する理由を説明するために、たとえば、データがスパースの場合、スペースを節約するために別の方法でレイアウトし、operator()がエンドユーザーから内部実装の問題を隠すことを考慮してくださいカプセル化を改善し、スペースや速度を向上させて、後でインターフェースを破壊することなく、内部レイアウトの変更を改善できます。

0