[Basic C++] #62_erase(), 주의할 점
STL 순차 컨테이에서 활용하는 erase() 함수에 대해 알아보겠습니다.
Overview
- 개념
- 코드 예제
#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' 반복자의 증가를 전제 조건으로 작성하지 않는 것이 해결방법이 될 수 있습니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #64_stack (0) | 2023.04.03 |
---|---|
[Basic C++] #63_string (0) | 2023.04.03 |
[Basic C++] #29_Set, STL 컨테이너 (0) | 2022.11.19 |
[Basic C++] #22_참조형 변수 (0) | 2022.10.12 |
[Basic C++] #28_static 키워드, 링킹, namespace (0) | 2022.10.09 |