2016-08-29 9 views
1

各要素が構造体である可変サイズの2次元行列が必要です。行数はコンパイル時に認識され、決して変更されません。列の数は行ごとに異なります。私はベクトルのベクトルでこれを実装しましたが、正しく行ったかどうかわかりません:C++:構造体のベクトルのベクトルの問題

struct MyStruct { 
    int a, b; 
    MyStruct(int arg_a, int arg_b) { a = arg_a; b = arg_b; }; 
}; 

int main(void) { 
    vector < vector<MyStruct> > myVVOfStructs; 
    myVVOfStructs.reserve(10); // Intended to reserve 10 rows of variable size vectors 

    vector<MyStruct> tmpVector = myVVOfStructs[5]; 
    tmpVector.push_back(MyStruct(10, 20)); 

} 

これは正しい方法ですか?上記のスニペットは、それをC++ファイルに単独で置くと動作します。しかし、私のはるかに大きいC++プログラムでは、上記の私はそれをやっている方法に問題がなければならない、

terminate called after throwing an instance of 'std::bad_alloc' 

だから、このメッセージで失敗し、それは簡単なC++ソースファイルで動作しますので、恋するベーカリーより複雑なプログラムではそうではありません。何か案は?それを行うより良い方法はありますか?

続き編集:この質問に対する回答は、「ベクターの予備(when)をいつ使うべきか」という別の質問に答えがあります。問題は、その答えを見つけるために、私はすでにreserve()が問題の原因であることを知る必要があるということです。それが立っているので、reserve()が私の問題の原因であるかどうか分からなかったので、そのタイトルのページを読んだことはありませんでした。私がすでにそれを知っていれば、私は自分自身で問題を理解するのに十分知っていたはずです。

+0

:あなたがメソッドを使用すべきベクトルの大きさを変化させるためには


。だから私はあなたの中の何か他のものが大規模なプログラムが非常に飢えていると仮定します。 – StoryTeller

+0

私のC++の知識は少し錆びますが、どうやってmyVVOfStructsを呼び出しますか?ベクトルをインスタンス化していないときにreserve(10)を宣言しただけですか? –

+0

また、 'std :: vector > vv = {{{10,20}、{30,40}、<その他の構造体}}、<その他の構造体のベクトル> }; '、もしあなたがC++ 11を使っているなら、 –

答えて

6

方法サイズを変更:

myVVOfStructs.reserve(10); 

は、ベクター自体のサイズを変更しませんが。 Reserve - Vector

この関数は、ベクトルの大きさに影響を及ぼさない、その要素を変更することはできません。

だから、

、あなたは6番目の要素にアクセスしようとしている:myVVOfStructs[5]がまだ存在しないので、UBを生成します

vector<MyStruct> tmpVector = myVVOfStructs[5]; 

を。それはあなたのプログラムがメモリ不足になりません。それ自体で

mmVVOfStruct.resize(10); 
+0

それでおしまい。 resize()ではなく、reserve()を実行したはずです。ボーンヘッドは私のところを動く。ありがとう! –

+0

@JB_Userは、 'tmpVector'が' myVVOfStructs [5] 'のコピーであることにも注意してください。その 'push_back'が' myVVOfStructs'を変更しようとしている場合は、代わりに参照を使いたいでしょう。 – crashmstr

-1

容量の変更を要求します。 ベクトル容量が少なくともn個の要素を含むことを要求します。

nが現在のベクトル容量より大きい場合、関数はコンテナの容量をn(またはそれ以上)に増やすためにストレージを再割り当てします。

その他の場合、関数呼び出しは再割り当てを起こさず、ベクトルの容量には影響しません。

この機能はベクトルサイズには影響を与えず、その要素を変更することはできません。

あなたはSTDを使用したい::ベクトル::

+0

できるだけ返信することをお勧めします。読みにくいです。 – David

関連する問題