Iterator invalidation

반복자는 저장 위치가 바뀌면 무효화된다

컨테이너를 수정한 뒤에도 같은 반복자를 계속 써도 되는지는 “원소 주소가 옮겨졌는가”와 “삭제 지점 뒤가 당겨졌는가”로 판단한다.

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;
}

시험과 실무 모두에서 핵심은 컨테이너 이름을 외우는 것이 아니라, 수정 후 생존 범위가 바뀌는 반복자를 즉시 다시 잡는 것이다.