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

Vector iterator not incremental .erase()

本文关键字:erase 迭代器      更新时间:2023-10-16

我正在尝试删除这个向量中与播放器冲突的任何元素。然而,当我试图从向量中删除元素时,程序崩溃,我得到了错误;"矢量迭代器不是增量的"。

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()",但没有成功。任何帮助都将是伟大的,提前感谢!

这已经被讨论得死去活来了。不能对无效迭代器进行操作。你想要这样的东西:

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

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

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