dポイントプレゼントキャンペーン実施中!

n × n の二次元配列の各要素に vector を突っ込みたいと思っています。
ちょうど三次元グラフで n × n の地表に可変な高さの草が生えてるようなのを想像していただければやりたいことが分かっていただけるかと。
で、このようにしてまずは確保しました。

int i, n = 2;
vector<int> ***vecMatrix;
vecMatrix = new vector<int>**[ n ];
for (i = 0 ; i < n ; i++)
vecMatrix[ i ] = new vector<int>*[ n ];

ここまでは問題ないのですが、次に vecMatrix[ i ][ j ] に対して要素を格納しようとして、

vecMatrix[ 0 ][ 0 ]->push_back( 1 );

とすると segmentation fault で落ちます。
ううーん、なぜでしょう。

A 回答 (2件)

そりゃ、そうです。


vecMatrix[ i ] = new vector<int>*[ n ];
では 「vector<int>へのポインタ」の配列が用意されるだけで、そのポインタが指ししめすところの「vector<int>」がありません。
そこにアクセスしに行けば、エラーになっても不思議ではありません。

このやり方をするなら、全てのvecMatrix[i][j]についてvector<int>を割り当てる必要があります。
for (i = 0 ; i < n ; i++) {
vecMatrix[ i ] = new vector<int>*[ n ];
for(int j= 0 ; j < n ; ++ j ) {
vecMatrix[ i ][j] = new vector<int>() ;
}
}

当然、解放も一つずつやるのをお忘れなく。

それか
vector<int> **vecMatrix;
vecMatrix = new vector<int>*[ n ];
for (i = 0 ; i < n ; i++)
vecMatrix[ i ] = new vector<int>[ n ];
なら、デフォルトコンストラクタで初期化されたvector<int>の配列になるので
vecMatrix[ 0 ][ 0 ].push_back( 1 );
で大丈夫なはず。

それか、いっそ、 vector<vector<vector<int>>> と入れ子にしてしまうか。
    • good
    • 0

んー、nが固定値なら


vector<int> vecMatrix[n][n];
だし、可変値なら
vector<vector<vector<int>>> vecMatrix;
でしょう。
型の想定がそもそもの間違いの始まりだと思いますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!