gpt4 book ai didi

c++ - "Iterator not incrementable"从 std::vector 删除项目时

转载 作者:太空宇宙 更新时间:2023-11-04 12:57:50 25 4
gpt4 key购买 nike

我目前正在使用 SDL2 和 C++ 开发游戏。

我的角色射出子弹,当然,当其中一颗子弹击中敌人时,它必须从他所在的 std::vector 中删除。

我的子弹 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;
}
}
}

现在的问题是,在删除该项目符号时,编译器给我一个断言失败,显示“表达式: vector 迭代器不可递增”。

我搜索了一些不同的解决方案来从 vector 中删除一个项目(使用迭代器,使用 pop_back 与其他一些函数混合使用)但没有一个有效。这个 vector 当然被游戏循环中的其他函数使用(绘图函数不断迭代它以绘制子弹纹理和更新函数,它负责所有逻辑)。

这些功能可能会引发这个问题吗?这会很奇怪,因为他们(当然)在他们的循环中使用不同的迭代器,所以他们不应该关心这个。

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

关于c++ - "Iterator not incrementable"从 std::vector 删除项目时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45753624/

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