繁体   English   中英

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

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

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

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>'

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

另外,由于移除后向量中的元素向下移动,因此移除项后是否应将i减1,以使其再次以相同的值执行循环? 还是有一种更优雅的方式呢?

您可以尝试:

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

是的,你应该减一。

我建议使用Erase / Remove习惯用法 您可以将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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM