2015-01-26 5 views
1

아주 간단한 질문입니다.'this'키워드를 사용하여 벡터에서 요소 제거

글 머리 기호가 개체와 충돌 할 때 어느 시점에서이 글 머리 기호는 불릿의 벡터에서 파괴되어 제거됩니다.

각 글 머리 기호 개체에는 벡터/글 머리 기호 목록에 대한 참조가 있습니다.

글 머리 기호 클래스에 키워드를 사용하면 어떻게 제거합니까?

void collide(){ 
    //error C2678: binary '==': no operator found which takes a left-hand operand of type 'Bullet' 
    //(or there is no acceptable conversion) 
    bullets->erase(std::remove(bullets->begin(), bullets->end(), *this), bullets->end()); 
} 

그래, 그 코드는 저에게 이상한 오류를줍니다. while/for 루프를 사용하고 벡터 함수를 사용하여 총알의 벡터를 반복하지 않고이를 수행하는 방법을 알아야합니다. 분명히 현재의 방법은 코드에서 주석으로 표시된대로 오류를 분출하기 때문에 작동하지 않습니다.

나는 또한 remove() 대신 find()를 사용하여 동일한 오류를 시도했다.

+6

당신이'Bullet' 클래스에 대한 항등 연산자 (예 : '연산자 ==를')이 있습니까? –

+6

오류 메시지가 거의 분명하지 않을 수 있습니다. 그리고'std :: remove' *는 vector를 반복하므로,이 접근법은 선형 비용을 가지지 않는다는 것에주의하십시오. –

+0

나는 하나도 가지고 있지 않지만 실제로 해결책을 사용할 수 있습니다. 여기에 연산자를 구현할 필요가없는 다른 예제를 보았습니다. == 아직이 메서드로 작업했습니다. 솔직히 말해서 벡터에서 요소 (this)를 제거하려면 어떻게해야합니까? –

답변

2

글 머리 기호 클래스에 == 연산자를 구현해야합니다. 당신이에 따라 항목을 삭제하려면 메모리 주소, 당신은 순진 요소를 간단한 벡터 반복 처리를 찾을 수 있습니다

for (Bullet& bullet : bullets){ 
     if (&bullet == this){ 
      bullets.erase(bullet); 
      break; 
     } 
    } 
+3

안전하지 않습니다. 벡터는 지울 때 내용을 다시 할당하므로 반복기가 무효화됩니다. 여기에 설명 된 http://stackoverflow.com/questions/10360461/removing-item-from-vector-while-in-c11-range-for-loop – SGrebenkin

+0

고쳐졌습니다. 고마워. –

1

당신은 지울 객체에 대한 반복자를 얻을 필요가있다.

bullets->erase(bullets->begin() + (this - &bullets.front())); 

참고이 즉 그 방법은 현재 실행하고있는 객체를 파괴 할 것이라는 점을, 당신이 나중에 회원의 개체에 액세스 할 수 없습니다 당신은 첫 번째와 현재의 객체 사이의 차이를 사용하여 얻을 수 있습니다 .

2

이 시도 :

std::remove_if(bullets.begin(), bullets.end(), 
    [this] (const Bullet& s) { 
     if (&s == this) 
      return true; 
     return false; 
    } 
);