C++ 반복자 무효화에 대해 궁금한게 있습니다!
글쓴이: greathero / 작성시간: 수, 2013/05/22 - 9:28오전
일단 반복자 무효화에 대해 작성된 글 중 일부분을 발췌해서 올립니다.
출처: <a href="http://printf.egloos.com/1824410 반복자가" rel="nofollow">http://printf.egloos.com/1824410 반복자가</a> 가리키는 요소를 삭제 할 경우 그 반복자는 무효화 된다. vector에 대해 erase를 호출하면 방금 삭제된 요소 다음에 있는 요소들을 가리키는 모든 반복자는 무효화 된다. 또한 push_back을 사용하여 vector에 요소를 추가해도 해당 vector를 가리키고 있던 모든 반복자는 무효화 된다. vector에 한 요소를 삭제하면 그 다음 요소들이 이동되고, 한 요소를 추가하면 새로운 요소를 위한 공간을 확보하기 위해 전체 vector가 재할당 되기 때문이다.
Q1. 위의 글을 읽다가 생각해보니 vector같은 컨테이너들에 일정 용량을 reserve하고 push_back을 하게 되면 반복자 무효화는 발생하지 않나요?
Q2. 반복자 무효화 현상을 원천적으로 방지하려면 반복자 변수를 사용하지 않으면 되는건가요?
Q3. 모든 STL 컨테이너의 삽입/삭제는 반복자 무효화 문제를 야기시키나요?
위 3가지에 대해서 궁금합니다~ 답 좀 해주시면 감사하겠습니다~ ㅎㅎ
Forums:
1. reserve로 지정한 용량을 넘어서면 문제가
1. reserve로 지정한 용량을 넘어서면 문제가 생깁니다. http://www.cplusplus.com/reference/vector/vector/push_back vector처럼 원소를 인덱스로 접근할 수 있는 컨테이너는 반복자 대신 인덱스를 쓰세요. 시간 복잡도 O(1)을 표준이 보장합니다.
2. 문제를 맞닥뜨리지 않으려면 컨테이너를 신중히 고르고 어떤 연산이 반복자를 무효화하는지 보세요.
3. list, map은 반복자를 무효화하는 경우가 vector보다 적습니다. 레퍼런스를 참고하세요. http://www.cplusplus.com/reference/vector/list/push_back
3번 링크가 잘못되었습니다.
http://www.cplusplus.com/reference/list/list/push_back/
댓글 달기