본문 바로가기
알고리즘 부셔버렷/나만의 작은 STL정보

[STL] erase remove idiom (설명, erase, remove 차이, 예)

by Unagi_zoso 2022. 6. 9.

    erase remove idiom이란

 

erase remove idiom은 c++ STL 컨테이너에서 어떤 특정한 원소를 제거하기 위한 기법입니다.

 

각 컨테이너의 멤버함수인 erase와 algorithm 라이브러리의 remove, remove_if 함수를 통하여 구현합니다.

 

 

 

     erase 함수와 remove 함수의 차이와 응용

 

우선 erase 함수와 remove 함수의 차이점을 말씀 드리자면

erase는 vector같은 연속적인 특성을 가진 컨테이너의 데이터를 지우는 경우 데이터를 지운 뒤 빈 공백, 틈들을 막기위해

뒤의 값들이 일제히 당겨집니다. 이때 상황에 따라 꽤 많은 오버헤드가 일어날 수 있습니다.

 

그리고 remove는 조건에 맞는 값을 그 뒤의 값들로 덮어씁니다. 그래서 해당 연속적인 특징을 가진 컨테이너의 뒤에는

중복적이며 쓸데없는 데이터들이 그대로 남게 됩니다. 

 

이러한 두 함수의 특성을 이용해 remove를 선행해 값들을 제거한 후 뒤의 중복되는 값들을 전부 erase로 제거하는 것입니다. 이렇게 중복된 부분을 다 제거하면 제거한 뒤 당겨올 값들도 없기에 erase의 사이드이펙트를 신경쓰지 않아도 됩니다.

 

 

 

// Removes all elements in vector with the value 3.
  vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end());

  // Removes all odd numbers in vector.
  v.erase(std::remove_if(vec.begin(), vec.end(), IsOdd), vec.end());

 

 

 

c++ 20에 들어서는 erase, erase_if 함수가 단일 함수 자체로 erase remove idiom을 구현합니다.

 

 

 

 

다음 글들을 참고하였습니다.

 

https://stackoverflow.com/questions/39019806/using-erase-remove-if-idiom

https://stackoverflow.com/questions/3792600/erase-remove-idiom-with-stdset-failing-with-constness-related-error

https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom#cite_note-effective_stl-7

댓글