C ++ vector,erase不明白

时间:2016-10-19 18:27:51

标签: c++ vector assertion

嗨,在我的项目中,roguelike RPG使用向量来保持多态指标到所有怪物,抽象类Mob的一部分。问题是在战斗期间 - 有一个函数返回迭代器选择我们正在攻击的nob(我跳过测试,如果这里没有怪物,它返回向量的开始)。

   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;
        }

弹出的断言失败: img

我知道擦​​除后会删除下一个元素但是如何删除vector中只有一个现有元素?

1 个答案:

答案 0 :(得分:0)

restart service

您按值传递Hero::TryAttack(vector <Mob*> monsters) 。返回的迭代器是指向量的不存在的副本。通过引用传递:

monsters