我目前正在使用SDL2和C ++开发游戏。
我的角色射击子弹,当然当其中一个击中敌人时,它必须从他所在的std :: vector中删除。
我的子弹矢量声明如下
std::vector<Bullet> _bullets;
当我尝试从中删除一个时,我会执行以下操作
void Player::DestroyBullet(Bullet b)
{
for (auto it = _bullets.begin(); it != _bullets.end();)
{
if ((*it).GetId() == b.GetId())
{
it = _bullets.erase(it);
}
else
{
++it;
}
}
}
现在的问题是,在擦除那个子弹时,编译器给我一个断言失败,它说“表达式:向量迭代器不可递增”。
我搜索了一些不同的解决方案来从一个向量中删除一个项目(使用迭代器,使用pop_back与其他一些函数混合),但它们都没有工作。这个向量当然是由游戏循环中的其他函数使用(绘图函数,它连续迭代它来绘制子弹纹理和更新函数,它负责所有逻辑)。
这些功能可能会引发这个问题吗?这很奇怪,因为它们(当然)使用不同的循环器迭代器,因此它们不应该关心它。
P.S。我正在使用Visual Studio 2015进行编程。
编辑1:应用程序 NOT 多线程。
编辑2:有点晚了但我几个月前发现在GCC上这个问题不存在。它只发生在Visual CPP编译器上。
答案 0 :(得分:0)
您应该使用::std::remove_if
代替:
_bullets.erase
(
::std::remove_if
(
_bullets.begin()
, _bullets.end()
, [&b](Bullet const & bullet)
{
return (bullet.GetId() == b.GetId());
}
)
, _bullets.end()
);