矢量迭代器不是增量.erase()

时间:2014-04-27 19:59:03

标签: c++ vector crash iterator erase

我正在尝试删除此向量与播放器发生冲突的任何元素。但是,当我尝试从向量中删除元素时程序崩溃,我得到错误; “vector iterator not incremental”。

for (std::vector<Coin>::iterator i=CoinSet.begin(); i!=CoinSet.end(); i++) 
{
    if (i->PlayerClear(player.collider()) == true)
    {
        score++;
        cout<<score<<endl;
        CoinSet.erase(i);
    }
}

这段代码完美无缺,直到“CoinSet.erase(i)”,我尝试在各个点使用“CoinSet.clear()”,但无济于事。对此的任何帮助都会很棒,提前谢谢!

2 个答案:

答案 0 :(得分:3)

这已被讨论过死亡。您不能对无效的迭代器进行操作。你想要这样的东西:

for (auto it = CoinSet.begin(); it != CoinSet.end(); /* no increment here! */ )
{
    if (/* ... */)
    {
        // ...
        CoinSet.erase(it++);
    }
    else
    {
        ++it;
    }
}

答案 1 :(得分:0)

我不喜欢将++语句放入参数中。因此,delete()返回一个指向下一个元素的迭代器,因此可以将擦除行替换为:

it = CoinSet.erase(it); // iterator is replaced with valid one