2

ベクトルへのプッシュバックがどのように機能するかについて興味があります。要素をプッシュバックし、ベクター内のその位置をマップのタイプとして機能する double 配列に追加できるようにする方法が必要です。

このようなもの:

// Create a bomb
Bomb b;
b.currentTime = SDL_GetTicks();
b.explodeTime = SDL_GetTicks() + 3000;
b.owner = player;
b.power = 2;    
b.x = x;
b.y = y;

bombVec.push_back(b);

bombs[y][x] = THIS_IS_WHAT_I_WANT;

このようにして、爆弾を爆発させたときに、マップを確認して、対処するベクター内の ID を取得できます。爆弾以外のすべてのマスには -1 があります。また、好奇心旺盛です。ベクトルに 3 つの要素があるとします。2 番目のものを削除してから、別のものを追加します。新しい要素は、削除された要素と同じ場所に配置されますか?

ありがとう!

4

2 に答える 2

5

その後、要素を取得するためにpush_back使用できます。back

Bomb b;
...
bombVec.push_back(b);
Bomb &bref = bombVec.back();

それともインデックスが欲しいですか?

必須の警告:別のアイテムを押し込むと、容量が十分に大きくない場合、ベクターのサイズが変更されます。これにより参照が無効になり、参照にアクセスするとプログラム エラーが発生します。これは、(1) インデックスによるアクセス (2) ポインターがvector(3)list代わりに使用する場合 (4) のサイズを変更しない場合は問題ありませんvector

インデックスの取得:

size_t index = bombVec.size();
bombVec.push_back(b);
于 2012-05-30T22:40:09.630 に答える
0

最後から始めましょう:

また、好奇心旺盛です。ベクトルに 3 つの要素があるとします。2 番目のものを削除してから、別のものを追加します。新しい要素は、削除された要素と同じ場所に配置されますか?

言語では削除には正確な意味がありますが、このコンテキストでは意味がありません。そのため、コンテナーからの削除を意味していると想定します。ベクトルから要素を消去すると、消去された要素よりも大きいインデックスを持つすべての要素が移動(またはコピー) され、消去された要素によって残された空きスペースが埋められます。新しい要素の場合push_back、その要素はコンテナの背面に追加されるため、同じ場所にはなりません。

別のオプションは、元の要素を消去するのではなく、古い要素がある場所に新しい要素を書き込むことです: v[ idx ] = new_value;. これにより、質問の最初の部分に進みます。

要素をプッシュバックしてから、ベクター内のその位置をマップのタイプとして機能する double 配列に追加できるようにする方法が必要です

基になるコンテナーとしてベクターを使用する際の問題は、コンテナーに対する変更操作によって反復子と格納された要素への参照が無効になることです。たとえば、erase上記は、より大きなインデックスを持つすべての要素へのイテレータとポインタを無効にします (技術的には、標準に従ってすべてのイテレータを無効にしますが、実際には....)。コンテナーに要素を追加すると、ベクトルを大きくする必要がある場合にすべての反復子/参照が実際に無効になる可能性があるため、さらに悪化する可能性があります。

一般的に推奨される代替手段は、要素の位置へのインデックスを保持することです。コンテナが大きくなってもインデックスは安定しますが、コンテナから消去すると間違った場所を参照してしまうので、操作には注意が必要です。ベクトルから要素を削除しないように管理できる場合 (たとえば、爆弾を削除済みとしてマークするフラグを追加するが、実際にはコンテナーから削除しない)、問題ははるかに単純になります。

于 2012-05-30T23:18:15.863 に答える