簡體   English   中英

從std :: vector刪除項目時“迭代器不可遞增”

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM