2016-12-26 22 views
-1

私はC++を学び始めました。私は多次元配列とベクトルの構文を理解しようとしていましたが、かなり混乱し始めました。私は多次元配列を初期化する方法を得る。それは簡単なようです:行に続いて列。しかし、ベクターはもう少し挑戦的です。私は同じ方法でそれらを初期化する必要がありますか、またはベクトルのベクトルを作成しますか?誰か助けてください。C++の多次元ベクトル

+2

ベクトルのベクトル(ベクトルの...)。 –

答えて

2

は、多次元ベクトルを宣言します。

vector<vector<int> > test(4,vector<int>(20)); 

彼らは、必要に応じて変更することができるベクトルですので、これは、2Dベクトルもちろん4 X 20が作成されます。インデックス付けは配列test[3][19]と同じです。

1

C++ 11を使用できる場合は、多次元配列とベクトルのベクトルを同様の方法で初期化できます。

int a1[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; 
std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; 

ただし、定義されていない動作に移行することなく要素にアクセスするには、理解しなければならない相違点があります。

多次元配列の場合、配列の要素のメモリは連続して割り当てる必要があります。ベクトルのベクトルの場合、要素のメモリは、おそらくは分離している可能性があります。 a1ため

メモリ:a2(最も可能性が高い)ため

a1[0][0] a1[1][0] a1[2][0] 
|   |   | 
v   v   v 
+---+---+---+---+---+---+---+---+---+ 
| | | | | | | | | | 
+---+---+---+---+---+---+---+---+---+ 

メモリ:また、列の数が同じでないとしたベクトルのベクトルを定義することが可能

a2[0][0] 
| 
v 
+---+---+---+ 
| | | | 
+---+---+---+ 

a2[1][0] 
| 
v 
+---+---+---+ 
| | | | 
+---+---+---+ 

a2[2][0] 
| 
v 
+---+---+---+ 
| | | | 
+---+---+---+ 

あります各行について。

std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5}, {6, 7, 8, 9} }; 

多次元配列では、列の数は各行で同じになることが保証されています。

上記の多次元配列a1が与えられた場合、a1[1][2]は有効な要素になり、a1[2][3]は無効な要素になります。上記の行を使用したベクトルのベクトルの場合、a2[1][2]は有効な要素ではなく、a2[2][3]は有効な要素です。