2015-04-22 101 views
2

这是一些代码,用于检查2个单元在彼此相互攻击后是否被杀死,但是当我移除向量中的位置时,单位超出范围。我怎样才能同时删除?从一个向量中删除多个元素C++

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); 
} 
+8

首先抹掉较大的索引 –

+0

@DieterLücking,这就是答案。你应该这样做:) –

+0

如果你不需要保持向量中元素的顺序,那么将想要移除的元素与向量的最后一个元素进行交换应该会更快,矢量的大小。 – anxieux

回答

0

第一点:在你的第一个块,呼叫erase(x, y)做一些事情比你预期的不同 - 它会删除从索引X直到刚刚指数在y之前元素的全范围。例如,如果我们有向量[a,b,c,d,e,f,g],那么擦除(2,5)会擦除2,3,4的索引,所以我们最终得到[a,b, F,G]。我猜你想擦掉两个元素,而不是整个范围。

观点二:由于迪特·勒金指出,只是先抹掉较高的指标元素,像这样:

if (MyUnit > EnemyUnit) { 
    PlayerUnits.erase(PlayerUnits.begin() + MyUnit); 
    PlayerUnits.erase(PlayerUnits.begin() + EnemyUnit); 
} else { 
    PlayerUnits.erase(PlayerUnits.begin() + EnemyUnit); 
    PlayerUnits.erase(PlayerUnits.begin() + MyUnit); 
} 
+0

我没有投票答复你。请不要对我进行这种指责。 – Nayuki

4

而是自己的编码去除逻辑的,它会使用std::remove_ifalgorithm是更好的管理。根据您是否支持C++ 11的编译器,Predicate可以是lambda或命名函数。

0

我想一个更好的办法来处理这将增加一个“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); 
    } 
} 

这是在至少我个人如何做到这一点。

相关问题