这是一些代码,检查两个单位在互相攻击后是否被杀死,我在向量中传递位置,但是当我移除一个单位时,向量的大小发生变化,因此第二个单位超出了范围。我如何同时移除两者?
if ((MyHealth <= 0) && (EnemyHealth <= 0))
{
PlayerUnits.erase(PlayerUnits.begin() + MyUnit, PlayerUnits.begin() + EnemyUnit);
}
else if (MyHealth <= 0)
{
PlayerUnits.erase(PlayerUnits.begin() + MyUnit);
}
else if (EnemyHealth <= 0)
{
PlayerUnits.erase(PlayerUnits.begin() + EnemyUnit);
}发布于 2015-04-22 18:28:50
第一点:在第一个块中,调用erase(x, y)执行一些与您预期不同的操作--它删除了从索引x开始的整个元素范围,直到索引y之前。例如,如果我们有向量a、b、c、d、e、f、g,那么擦除(2,5)将删除索引2,3,4,所以我们最终会删除a,b,f,g。我猜您只想删除两个元素,而不是整个范围。
第二点:正如Dieterücking所指出的,首先删除较高的索引元素,如下所示:
if (MyUnit > EnemyUnit) {
PlayerUnits.erase(PlayerUnits.begin() + MyUnit);
PlayerUnits.erase(PlayerUnits.begin() + EnemyUnit);
} else {
PlayerUnits.erase(PlayerUnits.begin() + EnemyUnit);
PlayerUnits.erase(PlayerUnits.begin() + MyUnit);
}发布于 2015-04-22 18:28:08
与其自己编写删除逻辑,不如使用std::remove_if从algorithm对其进行管理。根据是否有支持C++11的编译器,谓词可以是lambda,也可以是命名函数。
发布于 2015-04-22 19:13:15
我认为处理此问题的更好方法是在"unit“类中添加"isDead”条件:
void Unit::Update()
{
//other stuff
if(this->m_health <= 0) this->m_isDead = true;
}然后在主循环中:
void Game::Update()
{
size_t size = PlayerUnits.size();
//iterate backwards, so there is no skipping
for(int i = size-1; i>= 0; i--)
{
PlayerUnits[i]->Update();
if(PlayerUnits[i]->isDead()) PlayerUnits.erase(PlayerUnits.begin() + i);
}
}至少我是这样做的。
https://stackoverflow.com/questions/29805925
复制相似问题