2014-07-10 2 views
0

나는 std::vector<Bullet> bullets을 가지고 있으며 for-loop 아래에서 더 이상 살아 있지 않다면 벡터에서 총알을 제거하고 싶습니다.벡터에서 std :: vector :: iterator의 인덱스는 무엇입니까?

나의 계획은 pop_back()으로 요소를 제거하는 것입니다. 벡터에 하나 이상의 요소가있는 경우 먼저 벡터의 마지막 요소로 제거 할 요소를 교환하고 pop_back()을 호출합니다.

for (std::vector<Bullet>::iterator b = bullets.begin(); b != bullets.end(); ++b) { 
    if(!b->isAlive()) { 
    if (bullets.size() > 1) { 
     std::iter_swap(bullets + ..., bullets.end()); 
    } 
    bullets.pop_back(); 
    } 
} 

문제는 iter_swap의 첫 번째 매개 변수입니다. 나는 http://www.cplusplus.com/reference/algorithm/iter_swap/을 찾고 첫 번째 매개 변수의 구문은 벡터 + 요소의 위치입니다.

벡터에서 b의 색인을 어떻게 찾을 수 있습니까?

+1

어느 것이 든 누락되었거나 첫 번째 요소에 대해 * 반복기가 필요하며 이미 올바른 반복기가 있습니다 :'b'. – delnan

+0

왜'swap()'과'pop_back()'대신'std :: remove()'또는'std :: erase()'를 사용하지 않는 것이 좋을까요? – CoryKramer

+2

@Cyber ​​스왑 앤 팝은 일정 시간이 걸리는 반면 선형 시간은 걸리기 때문입니다. – delnan

답변

3

만약 요소가되지 제거되거나할지 여부를 지배하는 조건 :

bullets.erase(std::remove_if(bullets.begin(), bullets.end(), 
[](Bullet const& b) { 
    return !b.isAlive(); 
}), bullets.end()); 
:

object->isAlive() 

는 그런 다음 제거, 즉 삭제-제거 관용구를 수행하는 STL의 방법을 사용해야합니다


이제 특정 질문에 대한 답을 벡터 v의 반복자의 it 지수는과 같이 얻을 수 있습니다

auto indx = std::distance(v.begin(), it); 
3

std::vector을 필터링하는 더 쉬운 방법이 있습니다.

#include <algorithm> 

auto part = std::remove_if(
    bullets_.begin(), 
    bullets_.end(), 
    [](const Bullet &bullet) { return !bullet.isAlive(); }); 
bullets_.erase(part, bullets_.end()); 

이렇게하면 벡터가 살아 있고 죽은 글 머리 기호로 분할되고, 그 다음에 죽은 글 머리 기호가있는 세그먼트가 삭제됩니다.

std::remove_if() 기능은 partition()과 같지만 첫 번째 파티션의 순서 만 유지됩니다.

+0

감사합니다. 거기에 '자동'이란 유형이 있습니까? 내 지원하지 않습니다. –

+0

@ A.D. 컴파일러를 업그레이드 할 시간 ... 또는 적어도 최신 C++ 지원을 켜십시오. C++ 11입니다. –

+0

예, 알고 있습니다. 나는 타입이 무엇인지 궁금해서 그것을 위해'auto'를 교환 할 수 있고 당신의 솔루션을 사용할 수 있습니다. –