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>」に変換できません

私が見るすべての例では、パラメーターにintを使用しているため、何をすべきかわかりません。

また、ベクトル内の要素は削除後にシフトダウンされるため、アイテムを削除した後にiをデクリメントして、同じ値でループを再度実行する必要がありますか?それとも、それを行うためのよりエレガントな方法はありますか?

4

2 に答える 2

2

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

できれば、ループしている間はベクターの内容を変更しないことをお勧めします。ゲーム ループの最後に死んだエンティティを削除する必要がある場合は、どのエンティティが「死んだ」かを把握し、それらを「死んだリスト」に入れ、「死んだリスト」内のすべてを削除することをお勧めします。エンティティ リストをまとめて表示します。

于 2012-04-29T04:40:15.303 に答える
2

あなたは試すことができます:

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

はい、i をデクリメントする必要があります。

于 2012-04-29T04:15:59.247 に答える