언어/Basic C++

[Basic C++] #62_erase(), 주의할 점

Hardii2 2023. 4. 2. 21:53

 

[Basic C++] #62_erase(), 주의할 점

 

STL 순차 컨테이에서 활용하는 erase() 함수에 대해 알아보겠습니다.

 


 

Overview

 

  1. 개념
  2. 코드 예제

 

#0. 개념

1. std::erase()

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

 

Details

 

  • erase() 함수는 STL의 순차 컨테이너에 저장된 요소를 제거하는 데 사용됩니다.

 

#1. 코드 예제

1. 예제-1

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int>v = { 0, 1, 2, 3, 4, 5, 6 };

	v.erase(v.begin(), v.begin() + 1);

	for (auto val : v)
	{
		cout << val << endl;
	}

	return 0;
}

 

Details

 

  • 위 코드에서 vector 컨테이너는 0 ~ 6까지 총 7개 항목을 담고 있습니다.
  • 이때, erase 함수를 사용해 [v.begin(), v.begin()+1) 범위의 항목들을 삭제합니다.
  • 하지만, 결과는 { 1, 2, 3, 4, 5, 6 }으로, 첫 번째 항목만 삭제된 것을 확인할 수 있습니다. 
  • erase 함수는 첫 번째 인자로 받은 반복자가 가리키는 항목을 포함해, 두 번째 인자로 전달받은 반복자가 가리키는 항목 직전 위치의 항목까지 제거합니다. 두 번째 인자로 전달 받은 반복자가 가리키는 항목은 삭제되지 않습니다!!

 

2. 예제-2

// 기존 코드
vector<int> v{1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ++it) {
    if (*it == 3) {
        v.erase(it);
    }
}

// 수정 코드
vector<int> v{1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end();) {
    if (*it == 3) {
        it = v.erase(it);
    } else {
        ++it;
    }
}

 

Details

 

  • 위 코드는 for문을 돌며, 값이 3인 항목을 제거합니다.
  • 하지만, 'it' 반복자가 가리키는 원소를 제거하고 나면, 다음 원소가 'it' 반복자가 가리키는 위치로 이동하기 때문에 우리가 원하는 대로 작동하지 않습니다. erase 함수는 항목을 제거하고, 자동으로 항목들을 이동시기기 때문이죠!
  • 따라서, for문을 작성할 때, 'it' 반복자의 증가를 전제 조건으로 작성하지 않는 것이 해결방법이 될 수 있습니다.