2012-12-14 1 views
4

가능한 중복 : 지우기와 제거의 조합을 사용하는 다음 구문은 무엇을 의미합니까?


Difference between erase and remove

은 .... 내가 용기가 있다고 가정 무엇 평균 다음과 같습니다.

c.erase(remove(c.begin(),c.end(),99),c.end()); 

지울 필요가 없으며 제거 할 수 있습니까? 위의 예에서 지우기 및 제거의 특정 기능은 무엇입니까?

+5

지우기 제거 관용구를 찾으십시오. 나는 어딘가에 여기에 있다는 것을 안다. 기본적으로 알고리즘은 작업하고있는 컨테이너에 대한 지식이 없기 때문에 실제로 지우는 것은 불가능합니다. – chris

+1

나는 그것이 중복 적이라고 믿을 수 없다. –

답변

10

컨테이너 c에서 99과 같은 모든 요소를 ​​제거합니다.

std::remove은 실제로 요소를 제거하지 않습니다. 관심있는 모든 요소를 ​​컨테이너의 두 번째 부분으로 이동하고 첫 번째 항목을 나타내는 반복자를 반환합니다. 그런 다음 erase 멤버 함수는 실제로 컨테이너에서 요소를 제거하기 위해 반복기 범위를 사용합니다.

erase-remove idiom을 참조하십시오.

+0

우리는 다음과 같은 코드를 작성할 수 있습니까? c.erase (c.begin(), c.end(), 99); – Saikiran

+0

@Saikiran 아니요, 일반적으로 각 컨테이너의 인터페이스를 살펴 봐야합니다. 확실히'std :: vector','std :: deque','std :: list'로는 할 수 없습니다. 이것들은 모두 하나의 반복자를 요구하거나, 삭제 될 요소의 범위를 지정하는 2 개를 필요로합니다. – juanchopanza

+0

@juanchopanza 사실'std :: list'로 할 수있는 것은'erase'가 아니라'list.remove (99)'입니다. * erase-remove *보다 더 나은 선택입니다 목록에 대해 아무 것도 사지 않는 블록 삭제를위한 최적화. –