无效的std :: vector迭代器

时间:2017-04-05 03:28:28

标签: c++ vector iterator

我开始为我在C ++和sfml中使用的游戏编写自己的粒子效果系统。 在我的更新方法中,我在迭代向量时删除生命周期已过期的粒子。 我认为在删除元素之后我不小心不会使迭代器无效,正如你在方法的底部看到的那样,但是我得到的是exec_bad_access code = 1或code = 2。 异常总是指向擦除(it)行。 任何想法可能出错?

void ParticlesNode::updateCurrent(sf::Time dt)
{
   for(particleIterator it = _mParticles.begin(), end = _mParticles.end(); it != end;)
{
    // calculate new color RGBA
    float nr = it->color.r + it->colorDis.r * dt.asSeconds();
    float ng = it->color.g + it->colorDis.g * dt.asSeconds();
    float nb = it->color.b + it->colorDis.b * dt.asSeconds();
    float na = it->color.a + it->colorDis.a * dt.asSeconds();
    it->color = sf::Color{static_cast<Uint8>(nr),static_cast<Uint8>(ng),static_cast<Uint8>(nb),static_cast<Uint8>(na)};

    // new position
    it->pos = sf::Vector2f(it->pos.x + it->vel.x * dt.asSeconds(), it->pos.y + it->vel.y * dt.asSeconds());

    // new velocity by linear accelaration.
    float length = getLength(it->vel);
    float newLength = length + _mPData.accel * dt.asSeconds();
    float radians = cartesianToPolar(it->vel).y;

    it->vel = polarToCartesian(newLength, radians);
    // new velocity by gravity
    // new velocity by radial acceleration.


    // new remaining life time
    it->lifeSpan -= dt.asSeconds();
    if (it->lifeSpan <= 0)
       _mParticles.erase( it );
    else
        ++it;
 }
}

1 个答案:

答案 0 :(得分:4)

erase之后,迭代器it变为无效,但它仍然用于下一次迭代。

您应该使用erase的返回值来指定它,它指的是擦除元素后面的迭代器。

it = _mParticles.erase( it );

请注意,不仅erase点处的迭代器变为无效,之后的所有迭代器(包括end())也将变为无效。因此,您需要为每次迭代评估end(),即将for的条件更改为

for(particleIterator it = _mParticles.begin(); it != _mParticles.end();)