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

时间:2012-04-29 03:58:24

标签: c++ vector erase

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

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&lt; _Myvec&gt;'

我看到的所有示例都使用ints作为参数,因此我不知道该怎么做。

此外,由于向量中的元素在移除后向下移动,我应该在移除一个项目之后递减i,以便它再次执行具有相同值的循环吗?或者有更优雅的方式吗?

2 个答案:

答案 0 :(得分:2)

你可以尝试:

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

是的,你应该减少我。

答案 1 :(得分:2)

我建议使用Erase/Remove idiom。您可以将std::remove_if的结果提供给vector::erase,您应该全部设置完毕。它看起来像这样:

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

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