在这种情况下,如何从矢量中删除项目

How do I erase an item from a vector in this situation?

本文关键字:删除项目 这种情况下      更新时间:2023-10-16

我尝试的所有内容都出现语法错误。有人可以告诉我该怎么代替评论吗?这是我第一次使用矢量。

EntityList 是 Entity 类的静态向量。

for(int i = 0;i < (int)Entity::EntityList.size();i++) {
    if(!Entity::EntityList[i]) continue;
    if(Entity::EntityList[i]->isDead){
        //Erase from vector
        //Decrement i?
    }
    Entity::EntityList[i]->OnLoop();
}

我应该用什么来代替评论?我已经尝试了一些方法,但没有任何效果。例如,Entity::EntityList.erase(i);不行。我收到以下错误,我不明白:

无法将参数 1 从"int"转换为"std::_Vector_const_iterator<_Myvec>"

我看到的所有示例都使用整数作为参数,所以我不知道该怎么办。

另外,由于向量中的元素在删除后向下移动,我是否应该在删除项目后递减 i,以便它再次以相同的值执行循环?还是有更优雅的方法?

你可以试试:

Entity::EntityList.erase(Entity::EntityList.begin() + i);

是的,你应该递减 i。

我建议使用擦除/删除习惯用法。您可以将 std::remove_if 的结果提供给 vector::era,您应该已经全部设置好了。它看起来像这样:

entityList.erase(
    std::remove_if(entityList.begin(), entityList.end(), isEntityDead));

下面是一个示例:

#include <algorithm>
#include <vector>
class Entity {
public:
    bool isDead;
};
// Need this since isDead isn't a member function of Entity
bool isEntityDead(Entity& entity) {
    return entity.isDead;
}
int main(int argc, char** argv) {
    Entity ent1 = Entity();
    ent1.isDead = false;
    Entity ent2 = Entity();
    ent2.isDead = true;
    Entity ent3 = Entity();
    ent3.isDead = false;
    std::vector<Entity> entityList;
    entityList.push_back(ent1);
    entityList.push_back(ent2);
    entityList.push_back(ent3);
    std::cout << "Before removing anything: " << entityList.size() << std::endl;
    entityList.erase(std::remove_if(entityList.begin(), entityList.end(), isEntityDead));
    std::cout << "After remove/erase: " << entityList.size() << std::endl;
    return 0;
}

如果您可以帮助它,我建议您在循环访问时不要修改矢量的内容。如果您需要在游戏循环结束时删除死实体,那么最好弄清楚哪些实体是"死的",将它们放在"死列表"中,然后一次从实体列表中删除"死列表"中的任何内容。