簡體   English   中英

如何從 C++ 中的列表中刪除對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM