Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL 벡터에서 특정 값의 요소를 제거하는 방법

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, 조건) 함수를 사용해 훨씬 간결하게 동일한 작업을 수행할 수 있습니다.