C++ STL 벡터(vector)에서 특정 값을 가진 항목을 제거하려면 erase() 함수를 사용합니다. 다만 erase()는 위치(반복자)를 기준으로 동작하기 때문에, 값 자체를 삭제하려면 remove() 알고리즘과 함께 사용하는 'erase-remove 관용구'가 널리 활용됩니다.
알고리즘
시작 벡터 v와 이를 가리킬 반복자(iterator) it을 선언한다. 벡터를 초기화한다. erase() 함수를 사용해 지정한 값을 가진 요소를 제거한다. 남아 있는 요소들을 출력한다. 끝.
예제 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v{ 6, 7, 8, 9, 10 };
cout << "현재 벡터의 내용 :\n";
for (auto it = v.begin(); it != v.end(); ++it)
cout << ' ' << *it;
cout << '\n';
int target;
cout << "삭제할 요소를 입력하세요 -> ";
cin >> target;
// remove-erase 관용구: target과 같은 값을 가진 모든 요소 제거
v.erase(remove(v.begin(), v.end(), target), v.end());
cout << "현재 벡터의 내용 :\n";
for (auto it = v.begin(); it != v.end(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
출력 결과
현재 벡터의 내용 : 6 7 8 9 10 삭제할 요소를 입력하세요 -> 7 현재 벡터의 내용 : 6 8 9 10
동작 원리
std::remove(v.begin(), v.end(), target)는 벡터에서 target과 같은 값을 가진 요소들을 뒤쪽으로 밀어낸 뒤, 논리적인 새 끝(end)을 가리키는 반복자를 반환합니다. 이 시점에는 컨테이너의 실제 크기가 줄어들지 않으므로, 반환된 반복자부터 기존 끝까지의 구간을 v.erase()로 잘라내야 삭제가 완료됩니다. 위 예제는 이 두 단계를 한 문장으로 처리한 전형적인 erase-remove 관용구입니다.
참고로 C++20부터는 std::erase(v, target) 또는 std::erase_if(v, 조건) 함수를 사용해 훨씬 간결하게 동일한 작업을 수행할 수 있습니다.