从向量数组中删除敌人

时间:2018-07-14 14:29:13

标签: c++ arrays vector erase

这是我对此网站的第一个问题。我学习了一年的编程,并且总是在项目中找到解决我问题的答案。我知道这是一个非常简单的问题,这是一个代码:

next(element for element in tag if element['Key'] == filters[0]['Key'])['Value'] in filters[0]['Value']
=> True

碰撞工作正确,但是当子弹碰到索引为5的敌人时,代码总是删除最后索引的敌人,因此我可以删除仅向具有索引5或1或7的一个敌人射击的每个敌人。

1 个答案:

答案 0 :(得分:0)

执行enemyArray.erase(...)时,请勿增加i,因为您将跳过一个元素。

所以您应该像这样重写循环:

for (int i = 0; i < enemyArray.size();) {
    if (player->checkShoot()) {
        if ((bullet->getPositionX() >= enemyArray.at(i).getPositionX() && bullet->getPositionX() <= enemyArray.at(i).getPositionX() + 5)) {
            if ((bullet->getPositionY() >= enemyArray.at(i).getPositionY() && bullet->getPositionY() <= enemyArray.at(i).getPositionY() + 5)) {
                player->addScore(10);
                enemyArray.erase(enemyArray.begin() + i);
                continue;
            }
        }
    }
    ++i;
}

或者,采用更惯用的风格:

for (auto it = enemyArray.begin(), end = enemyArray.end();it!=end;) {
    if (player->checkShoot()) {
        if ((bullet->getPositionX() >= it->getPositionX() && bullet->getPositionX() <= it->getPositionX() + 5)) {
            if ((bullet->getPositionY() >= it->.getPositionY() && bullet->getPositionY() <= it->getPositionY() + 5)) {
                player->addScore(10);
                enemyArray.erase(it);
                continue;
            }
        }
    }
    ++it;
}

当然,如果您一次要清除一个敌人,则在删除元素后,应该break而不是continue来循环。

为了完整起见,如果要删除所有被子弹碰到的敌人,也可以使用std::remove_if,它比上面的2个循环更好,因为删除多个元素时元素移动较少。 / p>