0

Contact という名前のクラスがあり、127 行 20 列のマトリックスのようなオブジェクトへのポインターのデータ構造を構築したいと考えています。この方法で std::vector クラスを使用しようとしました

std::vector < std::vector<Contact* > > matrix (127, std::vector < Contact* > (20));

次に、ヘッダーで次のように宣言した

std::vector<std::vector<Contact* > > Buckets;

以前に初期化して宣言したマトリックスをそれに割り当てます(このステップは、基本的に、より明確で短い方法でそれを行う方法がわからないためです)。

Buckets = matrix;

しかし、次のような push_back 関数を使用して

Buckets[pot].push_back(cont_temp);

しばらくするとエラーが発生し (「'std::bad_alloc' のインスタンスをスローした後に終了します」)、修正方法がわかりません。

マトリックスをインスタンス化して初期化するための他の良い方法はありますか? ベクトルのベクトル (boost::multiarray ..?) を使用する代わりに、他の解決策を提案しますか?

ありがとう(ばかげた質問でごめんなさい、私は貧しい学生です:)

編集:エラーが見つかりました(範囲外の割り当てのみ)。この種のデータ構造に関する一般的な提案があれば、私はまだここにいます...

4

3 に答える 3

2

「しばらくしてから」と言うとき、それはどういう意味ですか?std::bad_alloc は、メモリが不足していることを意味します。メモリをむさぼり食うループはありますか?

于 2009-08-20T08:47:31.070 に答える
0

既知のサイズの2次元行列のみを使用する場合は、単純な配列を使用できます。

(Contact*) matrix[127][20];

もちろん、このアプローチは、コンパイル後にサイズを決定または変更できる場合は機能しません。この場合、ライブラリ、特にmulti_arrayをブーストすることをお勧めします。

短い例についてはこちらを完全なドキュメントについてはこちらをご覧ください。

typedef boost::multi_array<Contact*, 2> ContactContainer;
ContactContainer matrix(boost::extents[127][20]);
于 2009-08-20T11:34:54.493 に答える
0

マトリックス内の連絡先は動的に割り当てられますか? もしそうなら、あなたが言うとき:

Buckets = matrix;

動的に割り当てられた同じオブジェクトを指す 2 つのポインターができてしまい、後で問題が発生する可能性があります。代わりに、Boost の共有ポインターなどのスマート ポインターのベクトルを使用する必要があります。

于 2009-08-20T08:46:13.227 に答える