【问题标题】:Vector iterator not incremental .erase()向量迭代器不是增量的 .erase()
【发布时间】:2014-04-27 19:59:03
【问题描述】:

我正在尝试删除此向量中与播放器发生碰撞的任何元素。但是,当我尝试从向量中删除元素时,程序崩溃并出现错误; “向量迭代器不是增量的”。

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()”,但无济于事。对此的任何帮助都会很棒,在此先感谢!

【问题讨论】:

    标签: c++ vector crash iterator erase


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢,我在发布之前确实花了一个小时进行研究,但没有发现太多相关性(我很新)。无论如何,我现在收到错误“向量迭代器不兼容”?
    • @user3027864:如果你的编译器不支持C++11,那么你就不能那样使用auto,所以继续拼写类型。
    • @Veritas:如果it == begin()?!
    • 好的,可以了,非常感谢!相当烦人,我可以花这么长时间在一个单件上,然后让别人在 5 分钟内修复它。但是,熟能生巧!
    • @user3027864:不。从错误中学习是完美的。今天的课程是使用调试器。有条不紊,有条不紊。不要通过随机猜测来编程。我小时候遇到了完全相同的问题,第一次使用erase,虽然文档确实告诉你erase 使迭代器无效,但我们大多数人都不注意这些事情(更不用说阅读),所以我们需要找出困难的方法。调试器会告诉你哪里出了问题,然后然后你会被烧死并会注意文档。这个过程效果很好。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2011-05-06
      • 1970-01-01
      • 2017-08-29
      • 2018-07-14
      • 2011-11-15
      相关资源
      最近更新 更多