【问题标题】:C++ vector iterator not incrementalC++ 向量迭代器不是增量的
【发布时间】:2017-10-12 16:11:57
【问题描述】:

我一直为这个问题头疼。我挑战自己制作一个 CLI 太空射击游戏,你可以在其中拍摄宇宙飞船、激光和流星。问题是这样的:每当激光或流星到达我们竞技场的边界时,我想从向量中删除,这样它就不会聚集起来。这是我的工作代码现在的样子:

        std::vector<Meteoras>::iterator itMet = meteorai.begin();
        std::vector<Lazeris>::iterator itLaz = lazeriai.begin();
        while (itMet != meteorai.end() || itLaz != lazeriai.end())
        {
            if (itLaz != lazeriai.end())
            {
                if (itLaz->getCoord()->x == j && itLaz->getCoord()->y == i)
                {
                    itLaz->move(); 
                    ++j; 
                    if (itLaz->getCoord()->x >= ILGIS - 1) continue;
                    else std::cout << itLaz->getIcon();
                }
                ++itLaz;
            }
            if (itMet != meteorai.end())
            {
                if (itMet->getCoord()->x - 1 == j && itMet->getCoord()->y == i)
                {
                    itMet->move();
                    ++j;
                    if (itMet->getCoord()->x <= 0) continue;
                    else std::cout << itMet->getIcon();
                }
                ++itMet;
            }
        }

所以那里有两个“继续”。而不是他们,我尝试放置迭代器删除(如itLaz = lazeriai.erase(itLaz),但程序似乎在运行时崩溃,给出了我之前所说的错误。我尝试进行其他逻辑检查,但这似乎也不起作用。我将不胜感激如果有人可以解释从矢量中移除无用物体(在本例中为流星/激光)的正确方法。

【问题讨论】:

  • 向量元素的擦除使迭代器无效。删除向量的一个元素后,您需要从头开始重新启动。
  • 您可以从向量的末尾开始,然后继续到向量的开头。任何已删除的元素都会影响您已搜索的元素的顺序。不保证迭代器在元素被擦除后仍然有效,即使是反向的。
  • @ThomasMatthews 啊哈。好的。但是为什么不将它重置到向量的开头呢?它会再次开始循环,直到遇到另一个可删除对象,不是吗?
  • 问题是迭代器不再有效。从头开始会给你一个有效的迭代器。您可以从 begin() 重新加载,然后添加您离开的偏移量。
  • @ThomasMatthews 我似乎已经修复了。添加了 2 个新的布尔值(1 个用于激光,1 个用于流星),它们在逻辑上检查是否需要增加迭代器。如果它最近被擦除并重置为 begin(),则不需要它。谢谢您的帮助! :)

标签: c++ object vector iterator erase


【解决方案1】:

关于erase() 使迭代器无效的评论是正确的。一开始需要重启的部分是错误的。 (你可以这样做,但你当然不需要。)

erase() 返回一个仍然有效的迭代器,它指向被删除项之后的元素。

if( test for erasing )
{
    itLaz = lazeriai.erase(itLaz);
}
else
{
   ++itlaz;
}

您也许可以重构代码以改用std::remove_if()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多