2

11663 Bus Error次のことをしようとしたときがあります。

std::vector< std::vector<int> > bullets;
std::vector<int> num;
num[0] = 7;
bullets.push_back(num);

bulletsvectorの型がvector であるため、これでうまくいくと思いました。これが期待どおりに機能しないのはなぜですか? また、以下の作品;

std::vector< std::vector<int> > bullets;
std::vector<int> num (4, 100);
bullets.push_back(num);

なぜこれが機能するのかはわかりませんが、他のコードはそうではありません。

4

2 に答える 2

4
std::vector<int> num;
num[0] = 7;

numはまだ何もストレージを割り当てていません。[]そのインデックスに要素が存在することがわかっている場合にのみ、インデックス構文を使用してください。それ以外の場合は、必要に応じpush_backvectors ストレージ容量を拡張する を使用します。2 番目の例は、要素用に一定量のスペース (この場合は 4、すべて値 100) を予約するコンストラクターを使用したために機能します。

std::vector<int> num;
num.push_back(7);
bullets.push_back(num);

余談ですが、「これは機能しません」は、問題の説明としてはあまり役に立ちません。また、行列として使用されるベクトルのベクトルは、各要素を反復処理する必要がある場合、パフォーマンスが重要なコードではお勧めできません。

問題が発生するという事実がわかっている場合を除き、まだ破棄しないでください。心配する必要はありませんが、このアプローチではデータの局所性が失われることに注意してください。これは、各ベクトルが個別にストレージを割り当てるためです。このデータがタイトなループで繰り返される場合は、1 つの大きなベクトルを割り当てて、個々の位置のオフセットを手動で計算する方がよいでしょう。

于 2012-10-16T17:04:39.087 に答える
0
num[0] = 7;

する必要があります

num.push_back(7);
于 2012-10-16T17:05:15.120 に答える