young31415   8년 전

문제하고는 직접 관련이 있지는 않습니다만 공부하다보니 헷갈리는 부분이 있어 질문하게 되었습니다.

stl list관련한 질문입니다. 소스 보시면 abcdeabc라는 값을 리스트에 따로따로 떼어서 집어넣고 반복자를 이용해서 같은 값이 있으면 리스트에서 제거하는 코드입니다. 결과값은 cdec라고 나와야 할텐데 에러가 나네요. 이유가 뭘까요?

kesakiyo   8년 전

잘못된 점이 몇가지 보이네요.

1. 7번 줄에서 글자의 크기는 8인데 배열의 크기가 1이네요? 여기서 segmentation fault가 일어날 가능성이 농후합니다.

2. 18번 줄에서 iterator에서 상수를 더하셨네요? vector와 같이 연속된 공간에 할당된 이터레이터는 상수를 더하여 위치를 알 수 있지만

list는 연속된 공간에 할당이 되는 것이 아닙니다. 따라서 ++iter, iter++ 과 같은 전치, 후치연산으로 iterator의 위치를 조정할 수 있습니다.

3. 18번 줄에서 iterator를 전치연산으로 증가시킨다고 하더라도 문제가 발생합니다. 원래의 iterator를 증가시키면서 iterator가 list의 end를

가리킬 수 있습니다. 이 때 값을 가져오려고 하면 이 또한 잘못된 주소값을 접근하게 되므로 오류를 발생시킬 수 있는 원인이 됩니다.

4. 19, 20번째 줄에서 erase를 한 후 문제가 발생할 수 있습니다. list에서 iteartor로 값을 삭제한 후 erase함수를 erase를 반환합니다.

이 때 반환하는 값은 현재의 iterator가 가르키고 있던 상대적인 위치에 새롭게 오는 list의 원소를 가리키게 되죠. 이 값을 안받아주면

원래 iterator는 어디를 가리킬지 모릅니다??(이 부분은 확실하지 않네요. wiki나 reference 사이드를 참고해 보세요.

위 네가지를 수정한 코드를 올려볼께요. 좀더 좋은 코드가 있겠지만 작성자 님이 의도하신 사항을 최대한 고려해서 바꿔봤어요.

제 코드를 참고해서 더 좋은 코드를 만들어 보세요!!

young31415   8년 전

kesakiyo / 늦었지만 감사합니당.

댓글을 작성하려면 로그인해야 합니다.