0

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

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 以便它再次执行具有相同值的循环吗?还是有更优雅的方法?

4

2 回答 2

2

你可以试试:

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

是的,你应该减少 i。

于 2012-04-29T04:15:59.247 回答
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;
}

如果可以提供帮助,我建议不要在循环遍历向量时修改它的内容。如果您需要在游戏循环结束时删除已死亡的实体,那么您最好弄清楚哪些实体“已死亡”,将它们放入“死亡列表”,然后从您的“死亡列表”中删除任何内容一次所有的实体列表。

于 2012-04-29T04:40:15.303 回答