c++에서 list는 insert되거나 delete 되는 위치를 알 수 있을 때, insert나 delete를 빠르게 하기 위해서 씁니다. erase를 했으니, c++ list의 insert함수를 알아보고 어떻게 사용하는지 간단하게만 알아봅시다.

 


 먼저 예제입니다.

 

 int를 저장하는 리스트 my_list가 있네요. foo 함수는 리스트 내부에 있는 친구들을 향상된 for문으로 head부터 tail까지 순회합니다.

 

 다음에 insert할 위치와 insert할 item을 받아서, 특정 위치에 아이템을 넣습니다. 연산이 일어날 위치를 알고 있다면, 넣는 것이나 제거하는 것이나 시간이 오래 걸리지는 않습니다. 물론 다른 용법도 문서에 언급되고 있기는 하지만, 저 같은 경우 백준에서 문제를 풀 때  1번째, 단일 원소를 추가하는 용도로 매우 많이 써서 이 친구 위주로 설명하겠습니다.

 

 먼저, 처음에 리스트에는 1, 2, 3, 4, 5 순으로 들어가 있습니다. 

 

 그러므로 처음에 foo()를 호출했을 때에는 1 2 3 4 5 순서대로 출력이 될 겁니다. 

 

 먼저 iter는 begin에서 tail쪽으로 하나 이동했으니, 2를 가리키게 됩니다.

 

 다음에, 19번째 줄에 노란 노드를 가리키고 있는 iterator랑 10을 넘겨주었습니다. 이 말은 노란색 앞에 10을 추가한다는 의미입니다. 문서에서도 특정된 position 앞에 넣는다고 언급되어 있습니다.

 

 

 19번째 줄이 수행된 후에는 요래 되겠군요.

 

 다음에, iter를 list의 end로 보냈습니다.

 

 그러면 이터레이터가 노란색 부분을 가리킬 텐데요. 이 앞에 11을 추가하게 됩니다.

 

 그러면 그림이 요래 그려질 겁니다. 맨 뒤에 추가하는 코드인데요. 사실 이것은 push_back으로 처리하는 게 조금 더 깔끔합니다.

 

 그러면 이 부분은 뭘 의미할까요? iter가 my_list의 begin을 가리키고 있었습니다. 이 위치를 insert의 인자에 넘겨주었다는 이야기는 이 위치 앞에 12를 추가하겠다는 의미입니다. 추가된 후에는 12 1 10 2 3 4 5 11이 되겠죠?

 

 

 그래서 결과는 위와 같습니다. insert로 넘겨진 위치의 앞에 원소들을 추가한다만 기억해두면 좋을 듯 싶군요.

 

 


 그런데, 문서를 보시다 보면 리턴 값도 있다는 것을 알 수 있는데요. 어떤 것을 리턴할까요?

 

 

 이 프로그램을 실행시켜 보면 알 수 있습니다. 2번째 위치 앞에 벡터 안에 있는 원소들 22, 33을 추가합니다. 3번 range 용법도 꽤 쓰일 것 같긴 합니다만, 제가 백준 문제를 풀 때 자주 쓴 용법은 아닙니다. 하튼, 여기서 우리는 리턴값을 유심히 볼 필요가 있는데요.

 

 

 22가 출력됨을 알 수 있습니다. 이는 newly inserted elements 중에 1번째를 가리킵니다.