반복자는 저장 위치가 바뀌면 무효화된다
컨테이너를 수정한 뒤에도 같은 반복자를 계속 써도 되는지는 “원소 주소가 옮겨졌는가”와 “삭제 지점 뒤가 당겨졌는가”로 판단한다.
1. 내부 배열이 재할당되는가?
vector capacity 증가는 기존 반복자, 포인터, 참조를 대부분 끊는다.
2. 삭제 뒤 원소가 이동하는가?
vector/deque erase는 삭제 지점 이후 반복자를 다시 잡아야 한다.
| 컨테이너 | 삽입 | 삭제 | 안전한 습관 |
|---|---|---|---|
| vector | 재할당 시 전부 무효 | 지운 위치 이후 무효 | reserve 후 삽입, erase 반환값 사용 |
| deque | 앞/뒤와 중간 규칙이 다름 | 중간 삭제는 넓게 다시 잡기 | 수정 구간 주변 반복자 재획득 |
| list | 기존 원소 안정 | 삭제된 원소만 무효 | 지운 노드 반복자만 버리기 |
| map/set | 기존 원소 안정 | 삭제된 원소만 무효 | erase 대상 반복자만 갱신 |
위험한 루프
for (auto it = v.begin(); it != v.end(); ++it) {
if (*it < 0) v.erase(it);
}
erase가 돌려준 다음 위치로 이동
for (auto it = v.begin(); it != v.end(); ) {
if (*it < 0) it = v.erase(it);
else ++it;
}
시험과 실무 모두에서 핵심은 컨테이너 이름을 외우는 것이 아니라, 수정 후 생존 범위가 바뀌는 반복자를 즉시 다시 잡는 것이다.