kris6613   2년 전

c++에서 insert 함수를 찾아보니 해당 위치 왼쪽에 새로운 원소 삽입, 삽입한 원소를 가리키는 iterator 반환이라고 되어있던데 그 뜻은

만약 list {a, c, d}가 있고 iterator가 c를 가리킬 때 insert b를 하면 {a, b, c, d}가 되고 iterator는 삽입한 원소인 b를 가리키게 되는거 아닌가요?

그래서 만약 iterator가 c를 가리키고 insert b, c를 연달아 하면 {a, c, b, c, d}라는 결과가 나올줄 알았는데 {a, b, c, c, d}라는 결과가 나와서 왜 이런지 궁금합니다!

dlaud5379   2년 전

insert 메소드는 새로운 iterator를 반환하지만, 인자로 넘겨준 iterator를 수정하지는 않습니다. list.insert(it, b)를 해도 it은 계속 c를 가리키고, 새로 추가한 b를 가리키게 하고 싶다면 it = list.insert(it, b)를 해야 합니다.

아래에 코드를 추가했으니 천천히 읽어보시고 더 궁금한 게 있으면 댓글로 달아주세요!

nrbsld   3달 전

저 궁금한게 있습니다...

<<BP<A>>Cd-

아래 코드를 실행한 경우 iterator가 B를 가르키고 있고, insert를 하면 왼쪽에 추가가 되어 PB 순서대로 있어야 하는거 아닌가요? 근데 왜 cout을 하면 BP 순서로 나오는건가여??

 

dlaud5379   2달 전

무슨 자료구조를 사용하고 계시는지에도 유의하셔야 합니다.

올려주신 코드에서는 문자열을 list<char>로 표현하고 있는데, list는 링크드 리스트라서 특정한 위치에 insert를 하면 반복자도 데이터를 따라 한 칸씩 밀려납니다. 의도하신 동작을 구현하려면 it = li.insert(it, e);로 수정하셔야 합니다.

쓴 김에 눈에 짚이는 것이 또 있는데, C++에서 반복자를 사용하신다면 반복자 무효화(iterator invalidation)에도 유의해야 합니다. vector를 쓴다면 길이가 늘어나는 등의 이유로 메모리 할당을 다시 할 때마다 모든 반복자가 무효화됩니다(역참조해도 쓰레기 데이터만 나온다는 의미입니다!!). 지금 사용하고 계시는 list는 이 문제에서 꽤 안전한 편이지만 vector 등 다른 자료구조를 쓰신다면 자료구조에 대한 반복자 무효화 조건을 숙지하고(cppreference.com이 유용합니다) 실수로 밟지 않도록 조심하면서 쓰시는 것이 좋습니다.

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