如何在联系时从两个列表中删除元素?
问题描述:
我有一个非常困难的时间编程一个班的太空入侵者。我应该使用一个列表来存储我的“导弹”和一个列表来存储我的“外星人”。我按空格键加载一个新的外星人,当两个联系人,我试图删除他们两个,我甚至无法通过删除“外星人”。当发射多枚导弹时,我会遇到各种各样的错误,如果此功能被注释掉,导弹就能正常工作。我被迫将一个导弹列表传递给另一个已经包含外星人列表并删除两个列表的类。如何在联系时从两个列表中删除元素?
这里是有问题的代码:
bool AlienMgr::checkHit(PlayerMgr& playerMgr)
{
bool hit = false; // If the player hits an alien, switches to true and is returned.
list<Missile*>::iterator missileIter;
list<Missile*> missileList = playerMgr.getMissiles();
int missileCount;
FloatRect missileBounds;
FloatRect alienBounds;
iter = myAliens.begin();
while (!myAliens.empty() && iter != myAliens.end())
{
alienBounds = (*iter)->getGlobalBounds();
if (!missileList.empty() && !hit)
{
for (missileIter = missileList.begin(); missileIter != missileList.end() && !hit; missileIter++)
{
missileBounds = (*missileIter)->getMissileBounds();
if (alienBounds.intersects(missileBounds))
{
delete (*iter);
iter = myAliens.erase(iter);
cout << "HIT" << endl;
}
else
{
iter++;
}
}
}
else
{
iter++;
}
}
return hit;
}
答
你在你的代码的几个问题。我试图清理它们。另外,我希望你可以使用C++ 11.但是,还有更多的关键问题。你的代码太C++ 98'ish。 我劝了一些改进:
- 使用
std::vector
而不是std::list
(这是真的难找的情况下,当列表会更快) - 使用智能指针代替人工内存管理(代码将是非常简单的并且更容易理解)
*如果玩家击中外星人,则切换为true并返回。* - 否,它不会切换为true。这就是评论所说的,但这不是代码中发生的事情:)。在做任何修复之前 - 将变量声明移动到初始化的位置;在函数的开头声明它们是糟糕的,过时的做法。同样,你不应该手动管理你的对象的生命周期;存储值会阻止你不得不删除它们。清理噪音将帮助您专注于您遇到的实际问题。 –
如果你想移除一个外星人和所有与它碰撞的导弹,你需要在移除外星人之前移除导弹。 – molbdnilo