gpt4 book ai didi

c++ - 在主循环中删除元素并将其添加到 vector 中

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:09 26 4
gpt4 key购买 nike

我之前搜索过但找不到任何答案。我对 C++ 有点陌生,所以希望这个问题不会太愚蠢。

我正在尝试添加和删除 vector 中的元素,在我的例子中,在对所有粒子进行大更新或绘制循环期间填充了粒子。例如,移除一些粒子,因为它们已经死亡,但也添加了一些其他粒子,因为一个粒子与一个物体发生碰撞,我想在碰撞点显示一个小的粒子爆发。我在演示文件中制作了这个简单的测试代码以找到问题的根源。

我认为问题是因为我删除并添加了粒子,所以迭代器指针变得无效。删除有效,但是当我添加一些随机的时,我得到一个空指针。下面的代码有点冗长,我知道我应该将迭代器与 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 );
}
}

最佳答案

每次插入到vector 时,指向它的迭代器都可能失效。你不能这样做:

if ( ofRandom(1) < .1 ) addSomeNewOnes();
it++

因为在调用addSomeNewOnes()之后,是无效的。

您可以使用通过调用 vector::insert 返回的迭代器,但在您的情况下,这意味着重新设计您的代码。

无论如何,这是您可能想要做的事情,因为您的代码有点笨拙。

关于c++ - 在主循环中删除元素并将其添加到 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com