从 std::vector 中删除项目时"Iterator not incrementable"



我目前正在使用 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()
);

相关内容

  • 没有找到相关文章

最新更新