1. ホーム
  2. c++

[解決済み] C++による多次元ベクトル

2022-03-06 16:48:27

質問

C++を学び始めたばかりです。多次元配列とベクトルの構文を把握しようとしていたところ、かなり混乱し始めました。多次元配列を初期化する方法はわかりました。それは簡単なようです。 行の後に列が続きます。しかし、ベクターはもう少し難しいです。同じように初期化しなければならないのでしょうか、それともベクトルのベクトルを作成しなければならないのでしょうか?

どのように解決するのですか?

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 :

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

のメモリ a2 (最も可能性が高い)。

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] は有効な要素です。