我之前搜索过,但找不到任何答案。我对 c++ 有点陌生,所以希望这个问题不会太愚蠢。
我正在尝试在向量中添加和删除元素,在我的情况下,在所有粒子的大更新或绘制循环期间填充了粒子。例如删除一些粒子,因为它们已经死亡,但也添加一些其他粒子,因为一个粒子与一个物体碰撞,我想在碰撞点显示一个小粒子爆发。我在演示文件中制作了这个简单的测试代码,以深入了解问题的根源。
我认为问题是因为我删除并添加了迭代器指针变得无效的粒子。删除有效,但是当我添加一些随机的时,我得到一个空指针。下面的代码有点冗长,我知道我应该使用带有 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 );
}
}