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

C++ 벡터에서 특정 인덱스의 항목을 제거하는 방법

vector의 erase() 함수 이해하기

C++의 vector 컨테이너에는 여러 개의 요소가 저장되어 있을 수 있습니다. 이 중 특정 인덱스에 있는 요소를 삭제하려면 vector 클래스가 기본으로 제공하는 erase() 함수를 사용하면 됩니다. 삭제 작업이 끝난 뒤에는 남아 있는 나머지 요소들을 화면에 출력해 결과를 확인할 수 있습니다.

여기서 한 가지 주의할 점이 있습니다. erase() 함수는 인덱스 값을 직접 받지 않습니다. 대신 삭제할 요소의 위치를 가리키는 반복자(iterator), 즉 주소를 전달해야 하며, 이는 v.begin() + index 형태로 표현합니다. 여기서 v는 벡터이고, v.begin()은 첫 번째 요소(0번째 요소)의 위치를 가리킵니다. 여기에 인덱스를 더하면 반복자가 해당 인덱스 위치의 요소로 이동하게 됩니다.

동작 과정 예시

예를 들어 입력 벡터가 v = [5, 8, 6, 3, 2, 0, 1, 4]이고, 인덱스 2, 6, 5 순서대로 요소를 삭제한다고 가정해 보겠습니다. 이때 최종 출력은 [5, 8, 3, 2, 0]이 됩니다. 단계별로 살펴보면 다음과 같습니다.

  • 초기 배열: [5, 8, 6, 3, 2, 0, 1, 4]
  • 인덱스 2의 요소(6)를 삭제 → [5, 8, 3, 2, 0, 1, 4]
  • 인덱스 6의 요소(4)를 삭제 → [5, 8, 3, 2, 0, 1]
  • 인덱스 5의 요소(1)를 삭제 → [5, 8, 3, 2, 0]

요소를 하나 삭제할 때마다 뒤에 있던 요소들이 앞으로 한 칸씩 당겨지므로, 이후 삭제에 사용하는 인덱스는 항상 현재 배열 상태를 기준으로 계산해야 한다는 점에 유의하세요.

문제 해결 절차

  • v.erase(v.begin()+2)를 호출해 인덱스 2의 요소를 삭제합니다.
  • v.erase(v.begin()+6)을 호출해 인덱스 6의 요소를 삭제합니다.
  • v.erase(v.begin()+5)를 호출해 인덱스 5의 요소를 삭제합니다.

예제 코드

아래 구현 예제를 통해 erase() 함수의 동작 방식을 더 자세히 이해해 보겠습니다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    vector<int> v = {5,8,6,3,2,0,1,4};
    v.erase(v.begin()+2);
    v.erase(v.begin()+6);
    v.erase(v.begin()+5);
    for(int i = 0; i<v.size(); i++){
        cout << v[i] << " ";
    }
}

입력

{5,8,6,3,2,0,1,4}

출력

5 8 3 2 0

추가로 알아두면 좋은 점

erase() 함수는 요소 하나만 삭제할 수도 있지만, v.erase(v.begin()+first, v.begin()+last)처럼 시작 위치와 끝 위치를 함께 지정하면 범위 안의 여러 요소를 한 번에 삭제할 수도 있습니다. 또한 요소를 삭제하면 뒤쪽 요소들이 앞으로 이동해야 하므로 erase()의 시간 복잡도는 O(n)입니다. 따라서 삭제 작업이 매우 빈번한 상황이라면 std::list나 std::deque 같은 다른 컨테이너를 함께 고려해 보는 것이 좋습니다.