std::erase 함수는 해당 인덱스의 데이터를 지우고 그 뒤에 있는 데이터를 남은 자리만큼 앞으로 이동시킨다.
따라서 순차적으로 벡터 탐색시 인덱스를 기반으로 erase 하면 문제가 생기는데, erase함수로 벡터의 사이즈와 인덱스가 줄어들어, 초기 i값의 탐색 범위와 괴리가 생기기 때문이다.
vector<int> v = {1,2,3,4,5};
for(int i=0;i<v.size();i++){
if(i==2) v.erase(v.begin()+i) // v의 i번째 요소를 지움 (v[2] == 3)
} // 따라서 이 시점 이후로 v.size = 4, v ={1,2,4,5}
// 즉, for루프문을 4번만 돈다.
따라서 이를 해결하려면 루프문의 증감식을 사용하지 말고, 반복문 내부에서 조건적으로 증감해준다.
일반적인 인덱스 기반의 반복 루프문으로 벡터 접근시, erase 하지 않았을 경우에만 인덱스를 증가시킨다.
vector<int>v; for(int i=0; i<v.size(); ) { if(erase 할 조건) { v.erase(v.begin()+i); } else i++; // erase 안한경우에만 인덱스 증가 }
erase 는 삭제에 성공할시, 삭제한 요소의 바로 다음 iterator를 반환하기 때문에 이 값을 바로 대입시켜준다.
vector<int>v; vector<int>::iterator it; for(it v.begin(); i!=v.end(); ) { if(erase 할 조건) { it = v.erase(it); } else it++; // erase 안한경우에만 인덱스 증가 }