[C++] erase()와 remove() 함수의 차이

Doorbals·2023년 1월 29일
0

CPP

목록 보기
13/16

1. remove() 함수

: 주어진 값을 컨테이너 내에서 삭제하고 마지막 인덱스 + 1 (== end)를 반환한다. 단, 이 때 컨테이너의 크기가 실제로 줄어드는 것이 아니라, 삭제되어야 할 원소들의 위치에 유지될 원소들의 값을 덮어 씌우는 것이다. 그래서 컨테이너의 뒤 쪽에 쓸데없는 데이터가 남게 된다. 즉, remove() 함수는 어떤 것도 진짜로 없애지는 않는다.

string str = "ABC D E  F";
remove(str.begin(), str.end(), ' ');
cout << str;

실행 결과 : ABCDEFE  F
// ABCDEF까지가 원하는 값이고, 뒤의 E  F는 쓸데없는 데이터가 남은 것.

auto it = remove(str.begin(), str.end(), ' ');
	cout << it - str.begin();

실행 결과 : 6
// ABCDEF까지 총 길이 6, 마지막 인덱스 : 5 / end = 5 + 1 = 6

2. erase() 함수

: remove()와 다르게 실제로 주어진 값을 컨테이너 내에서 삭제하고, 공백을 채우기 위해 뒤의 값들의 위치를 앞으로 당겨온다. 따라서 컨테이너 크기가 삭제된 원소 크기만큼 작아지게 된다. 이 때 상황에 따라 오버헤드가 일어날 수 있다. 총 2가지의 사용 방법이 존재한다.

1) 특정 위치의 원소 제거

vector<int> v = { 1, 2, 3, 4 };
v.erase(v.begin());
for (int i = 0; i < v.size(); i++)
	cout << v[i];
    
실행 결과 : 234
// v.begin(), 즉 첫 위치의 원소 삭제 -> 1 삭제

2) 특정 범위의 원소 제거

vector<int> v = { 1, 2, 3, 4 };
v.erase(v.begin(), v.begin() + 2);
for (int i = 0; i < v.size(); i++)
	cout << v[i];
    
실행 결과 : 34
// v.begin()부터 v.begin() + 2 사이의 값 전부 삭제(끝은 삭제에 포함 X)

3. erase remove idiom

: C++ STL 컨테이너에서 어떤 특정 원소를 제거하기 위한 기법

vector<int> v = { 1, 2, 3, 4 };
v.erase(remove(v.begin(), v.end(), 3), v.end());
for (int i = 0; i < v.size(); i++)
	cout << v[i];

실행 결과 : 124
// remove만 하면 결과값이 1244가 나오게 되는데,
// erase를 함께 사용하면 remove() 사용 이후 발생하는 필요없는 중복 데이터를 삭제할 수 있다.

1) remove(v.begin(), v.end(), 3) 을 실행하면 3이 제거된 벡터의 마지막 위치(== end)를 반환한다.
2) erase(위에서 반환된 위치 , v.end()) 을 실행하면 뒤쪽의 remove()로 인해 생긴 필요없는 중복 데이터 부분이 삭제된다.


👁️‍🗨️ 참고
https://cryptosalamander.tistory.com/137
http://h2ostudio.egloos.com/4343561
https://jaynamm.tistory.com/entry/C-STL-vector-erase-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90
https://unagi-zoso.tistory.com/m/63

profile
게임 클라이언트 개발자 지망생의 TIL

0개의 댓글