我一直对这个问题很头疼。我挑战自己制作一个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)
,但程序似乎在运行时崩溃,给出我之前说过的错误。我尝试做其他逻辑检查,但似乎也没有。我如果有人能够解释从矢量中移除无用物体(在这种情况下是流星/激光)的正确方法,我将不胜感激。
答案 0 :(得分:1)
关于erase()
使迭代器失效的注释是真的。关于需要在开始时重新启动的部分是错误的。 (你可以做,但你当然不需要。)
erase()
返回一个仍然有效的迭代器,它指向被删除项目后的元素。
if( test for erasing )
{
itLaz = lazeriai.erase(itLaz);
}
else
{
++itlaz;
}
您可以重构代码以改为使用std::remove_if()
。