我目前正在使用 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与其他一些函数混合(,但没有一个有效。这个向量当然被游戏循环中的其他函数使用(绘制函数,它不断遍历它以绘制子弹纹理和更新函数,负责所有逻辑(。
这些函数可能会引发这个问题吗?这会很奇怪,因为他们(当然(使用不同的迭代器进行循环,所以他们不应该关心这个。
附言我正在使用Visual Studio 2015编程。
编辑 1:应用程序不是多线程的。
编辑2:有点晚了,但我几个月前发现在GCC上不存在这个问题。它只发生在Visual CPP编译器上。
你应该改用::std::remove_if
:
_bullets.erase
(
::std::remove_if
(
_bullets.begin()
, _bullets.end()
, [&b](Bullet const & bullet)
{
return (bullet.GetId() == b.GetId());
}
)
, _bullets.end()
);