gpt4 book ai didi

c++ - 无效的 std::vector 迭代器

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

我开始为我正在使用 C++ 和 sfml 开发的游戏编写自己的粒子效果系统。在我的更新方法中,我在迭代 vector 时删除了生命周期已过期的粒子。正如您在方法底部看到的那样,我想我小心不要在删除元素后使迭代器无效,但我得到的是 exec_bad_access code=1 或 code=2。异常总是指向 erase(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;
}
}

最佳答案

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

你应该通过erase的返回值来赋值,它指的是被删除元素后面的迭代器。

it = _mParticles.erase( it );

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

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

关于c++ - 无效的 std::vector 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43221294/

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