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://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom#cite_note-effective_stl-7
'알고리즘 부셔버렷 > 나만의 작은 STL정보' 카테고리의 다른 글
[C++ STL] lower_bound, upper_bound 요약 설명 (실전 알고리즘) (0) | 2022.07.27 |
---|---|
빈 컨테이너의 iterator, begin()과 end()는 무엇을 가리킬까. 그리고 증감 연산. (0) | 2022.06.16 |
[STL] 부분조합 구하기 (prev_permutation과 bool 배열을 응용) (0) | 2022.06.14 |
[STL] next_premutation() (STL 순열 ) (0) | 2022.06.01 |
문자열 문제에서 유용한 STL 함수 (0) | 2022.05.27 |
댓글