안녕하세요. 이번 시간에는 c++ list의 erase 함수 사용법을 간단하게 알아봅시다. 이 함수는 범위 제거를 하거나, 원소 하나만 제거를 할 때 쓰이는데요. 보통 저는 전자보다는 후자의 용도로 많이 쓰곤 합니다. 사실 후자의 용도만 알아도 큰 문제 없기도 하고요. 예제를 보겠습니다.

 


 먼저, 1, 2, 3, 4, 5를 순서대로 넣은 list가 하나 생성됩니다.

 

 9번째 줄에, 리스트의 시작을 가리키는 이터레이터 iter를 리턴합니다.

 

 

  그러면 iter는 1을 가리키게 됩니다. iter++을 하게 되면, 다음 원소를 가리키게 되는데요. 1 다음에 있는 원소는 2였으므로, 2를 가리키게 됩니다.

 

 

 이 상태에서 (*iter)를 출력하면 2가 됩니다. 그 다음이 문제인데요. iter = my_list.erase(iter)가 있습니다. 이것은 iter가 가리키는 원소를 제거합니다. 그리고 뭔가를 리턴하는데, 문서를 보면 제거된 마지막 원소의 following을 가리키는 이터레이션이 리턴된다고 합니다. 2가 마지막으로 제거될 것이므로 2의 다음 원소인 3이 리턴되게 됩니다.

 

 

즉, iter를 넘겨주면 iter가 가리키는 원소를 제거하고 해당 원소의 다음 원소가 있는 위치를 리턴합니다. 여기에서는 3을 가리키게 되겠네요.

 

 프로그램의 결과는 위와 같습니다.

 

 


 백준의 에디터 문제는 커서의 왼쪽에 있는 문자를 제거해야 하는 연산이 있습니다. 어떻게 해야 할까요? 예를 들어, 1 2 3 4 5가 있었다고 해 보겠습니다. 그러면 1의 왼쪽에 있다면, iterator는 1을 가리키고, 5의 왼쪽에 있었으면 iterator는 5를 가리키게 하면 됩니다. 만약에 문자열의 끝에 있었다면 어디를 가리킬까요? end()를 가리킬 겁니다. 이 때에는 5의 오른쪽에 커서가 있을 겁니다.

 

 

 이 상태에서, 커서 왼쪽에 있는 5를 제거하려면 어떻게 해야 할까요? 양방향 연결 리스트면, 앞으로 가는 것이나 뒤로 가는 것이나 복잡도는 O(1)이기 때문에 iter--를 해도 문제 없습니다.

 

 

 한 칸 앞쪽으로 이동하면 5를 가리킬 겁니다. 일단 iter가 가리키는 위치는 제거해야 하는 것이 맞고, 5를 제거한 후에는 iter가 어디를 가르키고 있어야 하나요?

 

 

 군청색 부분을 가리키고 있어야 합니다.

 

 

  따라서 먼저 iteration을 1칸 앞으로 이동시킨 다음에, 제거할 위치 다음 위치를 리턴하게 하고, iter가 가리키는 위치를 제거하면 됩니다. 커서가 문자열의 맨 앞에 있는 경우만 예외 처리 하면 되겠네요.