C++矢量,擦除不理解

C++ vector, erase don't understand

本文关键字:不理解 擦除 矢量 C++      更新时间:2023-10-16

在我的roguelike RPG项目中,我使用矢量来保持所有怪物的多态指示器,抽象类Mob的一部分。问题是在战斗中——有一个函数返回迭代器,选择我们正在攻击的nob(我跳过了测试,以防这里没有怪物,它返回vector的begin)。

   vector<Mob*>::iterator Hero::TryAttack(vector <Mob*> monsters)
{
    int trying_x = pos_x, trying_y = pos_y;
    switch (DIR)
    {
        case UP: trying_y--;
        case DOWN: trying_y++;
        case LEFT: trying_x--;
        case RIGHT: trying_x++;
    }
    if (!monsters.empty())
    {
        for (vector <Mob*>::iterator i = monsters.begin(); i != monsters.end(); i++)
        {
            if ((*i)->pos_x == trying_x && (*i)->pos_y == trying_y)
            {
                return i;
            }
        }
    }
    return monsters.begin();
}

当我调用这个函数时:

switch (hero.CheckAction())
        {
            case ATTACK:
            {
                //delete rat3;
                if(!monsters.empty()) 
                    monsters.erase(hero.TryAttack(monsters));
                test_map.Draw(monsters, NPCs);
                break;
            }
            default: break;
        }

there's poping assertion failure:img

我知道erase返回删除后的下一个元素,但我怎么能删除只有一个现有的元素在vector?

Hero::TryAttack(vector <Mob*> monsters)

按值传递monsters。返回的迭代器指向vector不存在的副本。通过引用传递:

Hero::TryAttack(vector <Mob*>& monsters)