2012-04-29 4 views
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); 작동하지 않습니다. 내가 이해할 수없는 다음과 같은 오류 얻을 :

가 'INT'에서 매개 변수 1 변환 할 수 없습니다 '표준을 :: _ Vector_const_iterator < _Myvec>'

나는 매개 변수를 사용하는 int를 참조 모든 예제, 그래서 나는 무엇을해야할지 모른다.

또한 벡터의 요소가 제거 된 후에 아래로 이동하기 때문에 항목을 제거한 후에도 i를 감소시켜야하므로 동일한 값으로 루프를 다시 수행해야합니까? 아니면 그것을하는 더 우아한 방법이 있습니까?

+1

'int' 인수를 사용하여'std :: vector :: erase' 예제를 실제로 본다면 틀린 것입니다. iterator *가 필요합니다. http://www.cplusplus.com/reference/stl/vector/erase/ – jamesdlin

답변

2

당신이 시도 할 수 :

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

그리고 그래, 당신은 난을 감소해야한다.

2

Erase/Remove idiom을 사용하는 것이 좋습니다. std::remove_if의 결과를 vector::erase에 제공 할 수 있으며 모두 설정해야합니다. 그것은 다음과 같이 보일 것입니다 :

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

내가 이 벡터의 내용 당신이 그것을 도울 수 있다면 당신은 그것을 통해 반복하는 동안 수정하지 않는 것이 좋습니다 것 : 여기

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

은 예입니다 . 죽은 엔티티를 게임 루프의 끝에서 제거해야하는 경우 엔, "죽은"엔티티를 "죽은"목록에 넣은 다음 "죽은 목록"에서 "죽은 목록"의 내용을 제거하는 것이 좋습니다. 엔티티 목록을 한 번에

관련 문제