[英]“Iterator not incrementable” while deleting an item from std::vector
我目前正在使用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與其他一些函數混合使用),但是它們都不起作用。 這個向量當然會被游戲循環中的其他函數使用(繪制函數不斷地循環迭代它以繪制子彈紋理,而update函數則負責所有邏輯)。
這些功能可能引起這個問題嗎? 這會很奇怪,因為他們為循環使用(當然)不同的迭代器,因此他們不必理會這一點。
PS我正在使用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()
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.