2009-03-14 5 views

답변

21

나는 좋아한다. erase은 처음부터 마지막 ​​인수 (두 반복자 모두)를 지 웁니다.

+1

remove_if() +1을 잊었습니다. . –

+0

매우 근사합니다. 전에는 본 적이 없어요. +1 – Bernard

+0

고마워, 그건 속임수 였어. –

6

remove_if를 사용하면이를 수행하는 "올바른 방법"입니다. 항목을 제거하면 반복기가 무효화되므로 반복기를 사용하여 순환하고 지우지 않도록주의하십시오. 사실, erase()를 기본 방법으로 사용하는 모든 예제는 벡터에 대한 나쁜 생각입니다. 지우기는 O (n)이므로 알고리즘 O (n^2)가됩니다. 이것은 O (n) 알고리즘이어야합니다.

아래에 나와있는 방법은 remove_if보다 빠르지 만 remove_if와는 달리 요소의 상대적 순서는 유지되지 않습니다. 주문 유지 (예 : 벡터 정렬)에 신경 쓰면 위의 대답과 같이 remove_if를 사용합니다. 주문에 신경 쓰지 않고 삭제할 항목 수가 일반적으로 벡터의 4 분의 1 미만인 경우이 방법이 더 빠를 수 있습니다.

for(size_t i = 0; i < vec.size();) 
    if(vec[i].isTiredOfLife()) 
    { 
     vec[i] = vec.back(); 
     vec.pop_back(); 
    } 
    else 
     ++i; 
+0

D' oh. 나는 그것을 잊었다. 내가 링크 한 페이지에서도 굵게 표시됩니다. : o 내 게시물을 삭제 했으므로 아무도 그것을 사용하지 않습니다. – Bernard

+0

벡터의 요소를 재정렬하지 않습니까? 예를 들어 입력 벡터가 정렬되고 출력 벡터가 정렬되지 않는다고 가정하면 마지막 요소는 첫 번째 삭제 된 요소의 위치를 ​​취합니다. –

+0

버나드를 더 이상 언급하지 않도록 답변을 업데이트하고 싶을 수도 있습니다. –

관련 문제