[英]How do you remove a object from a list in C++?
這就是我遇到問題的地方。 一旦生物死亡,我需要從數組中刪除一個對象。
for each(BaseObject monster in MonsterList)
{
if(MonsterSelect == monster.GetName())
{
Damage = Player.GetATK() - monster.GetDEF();
monster.SetHP(monster.GetHP() - Damage);
cout << monster.GetName() << " has taken " << Damage << "." << endl;
if(monster.GetAliveFlag() == false)
{
cout << monster.GetName() << " has died." << endl;
MonsterList.remove(monster);//This is where the object needs to be removed.
int sdf = 234;
}
}
}
您應該使用帶有迭代器的普通 for 循環並為列表應用擦除方法。
像這樣的東西
for ( auto it = MonsterList.begin(); it != MonsterList.end(); )
{
//...
if( MonsterSelect == it->GetName())
{
//,,,
if( it->GetAliveFlag() == false)
{
it = MonsterList.erase( it );
//...
}
else
{
++it;
}
}
else
{
++it;
}
}
您可以重新格式化循環,使其更具可讀性。
我想每次當當前怪物滿足某個條件時,您只需刪除列表中的這個怪物。
至於方法 remove 然后它刪除列表中與給定怪物相等的所有元素。
我將把它解釋為問你如何用寫得很好的 C++ 來完成這個基本任務。
首先,我將擺脫for
循環。 其次,我會將大部分邏輯移到一類或另一類中。 現在,這些對我來說看起來像准類——即,所有真正的邏輯都在單獨的代碼中,對幾個基本上是愚蠢的數據對象進行操作,通過使用訪問器來獲取原始數據偽裝成類。
因此,如果您在實際的 C++ 中執行此操作,您最終可能會得到一個地圖(或多地圖),讓您可以按名稱查找怪物。 所以,你會有這樣的事情:
auto monster = monsters.find(monsterSelect);
if (monster == monsters.end())
// Not found
if (monster.kill(player.attack())) {
cout << monsterSelect << " has died.\n";
monsters.erase(monster);
}
目前,我假設任何一個名字都只有一個怪物。 如果這可能真的是針對多個怪物的攻擊,那么您有幾個選擇。
首選(至少 IMO)是將“與怪物戰斗”部分與“從列表中刪除死怪物”部分分離。 我可能會使用 Boost 過濾器迭代器遍歷給定名稱的所有怪物,然后使用刪除/擦除習語從列表中刪除所有死怪物。 (但是請注意,remove/erase 習慣用法特定於順序集合,不適用於關聯容器)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.