출처 : http://gamepro.tistory.com/263

///////////////////////////////////////////////////////

for( Iterator= Vector.begin(); Iterator != Vector.end();)

{

Vector.erase(Iterator);

}

///////////////////////////////////////////////////////

for( Iterator = List.begin(); Iterator != List.end(); )

{

List.erase(Iterator);

}

위 두 문장의 차이가 뭘까?

위의 문장에서는 문제가 없지만 아래 문장에서는 에러가 발생한다.

왜 그럴까? erase 함수의 구현은 둘다 똑같은데...

그 이유는....

RandomAccessIterator와 BidirectionalIterator의 차이에 있다.

vector는 해당 원소가 삭제되면 Iterator의 공백을 삭제된 원소다음에 있는 원소 위치로 채워지게 된다. 이는 RandomAccessIterator(멋대로 접근 가능 지시자)라 가능한 듯...(솔직히 컴파일러에 따라 다른지 그것까지는 모르겠음. 일단 Visual Studio에서는 그렇게 작동)

허나 list는 BidirectionalIterator(순서대로 차근차근 접근 가능)이므로 해당 원소가 삭제되면 Iterator는 그 다음 위치를 잃어버리게 되는 것이다. 결국 그 다음 지시자의 위치는 까마득한 별나라로...

이를 위한 해결 방법

가장 확실한 방법은 erase 함수의 리턴값을 이용하는 것이다.

erase 함수의 리턴값이 바로 삭제 원소 다음에 있는 원소 iterator이기 때문...

for( Iterator = List.begin(); Iterator != List.end(); )

{

Iterator = List.erase(Iterator);

}

뭐 굳이 ++을 쓰고 싶다면...

for( Iterator = List.begin(); Iterator != List.end(); )

{

List.erase(Iterator++);

}

이런 식으로 사용하면 된다. 허나....

for( Iterator = List.begin(); Iterator != List.end(); Iterator++)

{

List.erase(Iterator);

}

이런 식의 사용은 오류를 초래... 위에 설명했다시피 Iterator는 erase 함수를 거쳐 이미 갈 곳을 잃었기 때문에 Iterator++ 이란 문장은 엄한 곳만 가리키기게 되는 꼴....

+ Recent posts