以前に検索しましたが、答えが見つかりませんでした。私はC++に少し慣れていないので、この質問がそれほど愚かではないことを願っています。
ベクトル内の要素を追加および削除しようとしています。私の場合は、すべてのパーティクルの大規模な更新または描画ループ中にパーティクルが入力されています。たとえば、いくつかのパーティクルが死んだために削除しますが、1つのパーティクルがオブジェクトと衝突したために他のいくつかのパーティクルを追加し、衝突点で小さなパーティクルバーストを表示したいとします。問題の根底に到達するために、この簡単なテストコードをデモファイルで作成しました。
問題は、パーティクルを削除して追加したため、イテレータポインタが無効になることだと思います。削除は機能しますが、ランダムなものをいくつか追加すると、nullポインターが返されます。以下のコードはやや冗長です。begin()とend()でイテレータを使用する必要があることはわかっていますが、これらについても同じ問題があり、コードを少し試して、JavaScript配列スタイルのループをもっと試しました。それ。
void testApp::drawParticles()
{
int i=0;
int max = particles.size();
vector<Particle*>::iterator it = particles.begin();
while ( i < max ) {
Particle * p = particles[i];
if ( ofRandom(1) > .9 ) {
it = particles.erase(it);
max = particles.size();
} else {
ofSetColor(255, 255, 0);
ofCircle( p->x, p->y, p->z, 10);
if ( ofRandom(1) < .1 ) addSomeNewOnes();
i++;
it++;
}
}
}
void testApp::addSomeNewOnes()
{
int max = ofRandom(4);
for ( int i=0; i<max; i++ ) {
Particle * p = new Particle();
p->x = ofRandom( -ofGetWidth()/2, ofGetWidth()/2 );
p->y = ofRandom( -ofGetHeight()/2, ofGetHeight()/2 );
p->z = ofRandom( -ofGetHeight()/2, ofGetHeight()/2 );
particles.push_back( p );
}
}