List와 Vector를 비교해보자.
for(iterator = Vector.begin(); iterator!= Vector.end();)
Vector.erase(iterator);
for(for(iterator = List.begin(); iterator!= List.end();)
List.erase(iterator);
위의 문장에서는 문제가 없지만 아래 문장에서는 에러가 발생한다.
RandomAccessIterator와 BidirectionalIterator의 차이에 있다.
Vector는 해당 원소가 삭제되면 Iterator의 공백을 삭제된 원소 다음에 있는 원소 위치로 채워지게 된다. 이는 RandomAccessIterator라 그런 것으로 보임(확실한 것 x, Visual studio에서는 그렇게 작동)
하지만, List는 BidirectionalIterator이므로 해당 원소가 삭제되면 Iterator는 그 다음 위치를 잃어버리게 되는 것이다. next 노드의 주소가 증발해버린다고 생각하면 된다.
가장 확실한 방법은 erase 함수의 리턴값을 이용하는 것이다.
erase 함수의 리턴값은 삭제 원소 다음에 있는 원소 Iterator이기 때문이다.
for(for(iterator = List.begin(); iterator!= List.end();)
List.erase(iterator++);
for(for(iterator = List.begin(); iterator!= List.end();)
iterator = List.erase(iterator);
// 아래는 불가능, erase를 호출한 시점에서 갈 곳을 잃어버린다.
for(for(iterator = List.begin(); iterator!= List.end();iterator++)
List.erase(iterator);