我之前搜索過但找不到任何答案。我對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);
}
}
我結束了剛剛重做我的代碼,並在循環完成後做我的插入,並沒有攪亂主循環迭代器 –