erase와 remove의 차이
erase, remove
한줄로 간단하게 말하자면 erase는 멤버함수이고 remove는 알고리즘이다.
◎ erase
컨테이너의 erase는 실제 객체를 제거한다.
하나를 지울 수 있는데 STL의 데이터 공간까지 다 지우는 것이다.
즉, iterator에 해당하는 하나의 요소만을 삭제하며 capacity가 감소한다.
vector<int> v;
v.resize(10, 0);
for (int i = 0; i < v.size(); ++i)
{
v[i] = i + 1;
}
다음과 같이 1부터 10까지의 벡터가 있다고 가정한다.
auto iter = v.begin();
v.erase(iter + 1); // index 1번값 = 2
printVector(v);
iterator가 begin값에서 +1, 즉 2를 가리키고 있는 상태에서 erase시키면 다음과 같은 결과가 나온다.
◎ remove
Algorithm의 remove는 그 요소를 덮어씌움으로써 지워진 것처럼 보이게 된다.
정확하게 말하면 지워야 할 원소를 뒤의 원소들을 하나씩 앞으로 당겨서 덮어 씌우는 것이다.
erase는 capacity까지 감소되었지만 remove는 조건을 함께 넘기면 조건과 일치하는 원소들은 다 지워지는데 공간은 그대로 남아있고 데이터만 삭제 된다.
즉, 해당 조건에서 일치하는 모든 요소는 삭제하지만 capacity는 그대로이다.
◎ erase + remove?
특정 조건에 해당하는 원소를 아예 지우려면 erase와 remove를 함께 사용하면 좋다.
remove는 제거되지 않은 마지막 원소를 가리키는 itertor를 리턴하기 때문에
erase( remove(시작, 끝, value), 컨테이너의 end 반복자);
의 형태로 사용해준다.
'Study > STL' 카테고리의 다른 글
[STL] next_permutation & prev_permutation (순열) (0) | 2020.09.11 |
---|