편집 :std::remove
이 답변이 작성된 이후 설명서 가 수정되었습니다. 에도 같은 내용이 적용됩니다 list::remove
.
cpluscplus.com이 어떻게 잘못 될 수 있는지 보여주는 예를 들어 보겠습니다.
의 std::remove
함수를 고려하십시오 <algorithm>
.
사실은 std::remove
컨테이너에서 항목을 제거하지 않습니다. 그 이유 std::remove
는 한 쌍의 반복자와 만 작동하며 실제로 항목을 포함하는 컨테이너에 대해서는 아무것도 모르기 때문입니다. 사실, std::remove
기본 컨테이너를 알 수는 없습니다. 반복자가 속한 컨테이너에 대해 한 쌍의 반복자에서 벗어날 수있는 방법이 없기 때문입니다. 따라서 std::remove
실제로는 항목을 제거 할 수 없기 때문에 항목을 제거 하지 않습니다 . 컨테이너에서 항목 을 실제로 제거하는 유일한 방법 은 해당 컨테이너에서 멤버 함수를 호출하는 것입니다.
따라서 항목을 제거하려면 Erase-Remove Idiom 을 사용 하십시오 .
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
그러나에 cplusplus.com
대한 잘못된 정보를 제공합니다 std::remove
. 그것은 말한다
공지 사항이 기능은 변경하지 않는 새로운 끝에 과거의 요소, 자신의 이전 값을 유지 하고있다 여전히 접근을 .
맞지 않습니다. 범위의 반복자 [new_end, old_end)
는 여전히 역 참조 가능하지만 이전 값 을 유지하고 여전히 액세스 가능 하다는 의미는 아닙니다 . 그들은 지정되지 않았습니다.
마찬가지로, 잘못된 정보도 cplusplus.com
제공 합니다. 라고 말합니다 .list::remove
글로벌 알고리즘 함수 인 remove 는 유사한 동작으로 존재 하지만 두 반복자 사이에서 작동합니다.
완전히 잘못되었습니다. 글로벌 제거, 즉 std::remove
유사하지 않다 list::remove
우리는 전자는 것을 본대로, 정말 제거하지 않는 컨테이너에서 항목을 있기 때문에 할 수 없습니다 후자 (멤버 함수)이있는 반면, 정말 제거하지 항목을 이 할 수 있기 때문에 .
이 답변은 다음 주제의 다른 답변에서 수정되었지만 거의 수정되지 않았습니다.
참고 : 위의 주제에서 답장을 할 때 최근에 이것을 보았으므로 기억합니다. 지난 2 년 동안 내가 겪었던 많은 오류가 있는데, 기억 나지 않습니다. 다시 건너면 나중에 몇 개 더 추가 할 수 있습니다.