STL erase() 주의사항

서재혁·2022년 7월 29일
0

C++

목록 보기
5/7

문제

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

출처: https://blog.naver.com/PostView.naver?blogId=picbuddy&logNo=80032246219&redirect=Dlog&widgetTypeCall=true&directAccess=false

profile
조금만 더

0개의 댓글