이 글에서는 C++ STL의 list::erase() 함수가 어떻게 동작하는지, 그 문법은 어떻게 되는지, 그리고 실제 활용 예제를 통해 자세히 알아보겠습니다.
STL에서 리스트(List)란 무엇인가?
리스트는 시퀀스 내 어느 위치에서든 상수 시간(constant time) 안에 삽입과 삭제가 가능한 자료구조입니다. 리스트는 이중 연결 리스트(doubly linked list)로 구현되며, 비연속적인 메모리 할당을 허용합니다.
배열(array), 벡터(vector), 덱(deque)과 비교했을 때, 리스트는 컨테이너의 임의 위치에서 요소를 삽입·추출·이동하는 작업에서 훨씬 뛰어난 성능을 보입니다. 다만 리스트는 특정 요소에 직접 접근하는 속도가 느리다는 단점이 있습니다. 리스트는 forward_list와 유사하지만, forward_list는 단일 연결 리스트(singly linked list)이므로 앞쪽 방향으로만 순회할 수 있다는 차이가 있습니다.
list::erase()란 무엇인가?
list::erase()는 C++ STL에 내장된 함수로, <list> 헤더 파일에 선언되어 있습니다. erase()는 리스트 컨테이너에서 요소를 제거하는 데 사용되며, 단일 요소 또는 범위(range)에 해당하는 여러 요소를 모두 삭제할 수 있습니다. 제거된 요소의 개수만큼 리스트 컨테이너의 크기(size)가 줄어듭니다.
문법(Syntax)
list_container.erase(position); list_container.erase(start_position, end_position);
이 함수는 아래와 같이 하나 또는 두 개의 매개변수를 받을 수 있습니다.
매개변수(Parameters)
position – 삭제하고자 하는 단일 요소의 위치(반복자)
start_position, end_position – 삭제하고자 하는 요소들의 시작 위치와 끝 위치로, 삭제할 범위를 정의합니다.
반환 값(Return Value)
erase() 함수는 마지막으로 삭제된 요소의 다음 위치를 가리키는 반복자(iterator)를 반환합니다.
예제 1: 단일 요소 삭제하기
아래 코드에서는 STL의 erase() 함수를 사용해 리스트에서 요소를 삭제합니다. 먼저 begin() 함수를 사용해 첫 번째 요소를 가리키는 반복자를 얻은 뒤, 해당 반복자를 erase()에 전달하여 리스트의 첫 번째 요소를 삭제합니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
// 리스트 생성
list<int> myList;
myList.push_back(2);
myList.push_back(4);
myList.push_back(6);
myList.push_back(8);
myList.push_back(10);
cout<<"요소 삭제 전 리스트: ";
for (auto i = myList.begin(); i!= myList.end(); i++){
cout << *i<< " ";
}
// 첫 번째 요소를 가리키는 반복자
list<int>::iterator i = myList.begin();
myList.erase(i);
// 요소 삭제 후 리스트 출력
cout << "\n요소 삭제 후 리스트: ";
for (auto i = myList.begin(); i!= myList.end(); i++){
cout << *i << " ";
}
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
요소 삭제 전 리스트: 2 4 6 8 10 요소 삭제 후 리스트: 4 6 8 10
예제 2: 범위를 지정하여 여러 요소 삭제하기
아래 코드에서는 두 개의 반복자를 사용해 범위 내의 요소들을 한 번에 삭제합니다. 반복자 1(i_1)은 begin() 함수로 첫 번째 요소를 가리키고, 반복자 2(i_2) 역시 begin()으로 초기화한 뒤 advance() 함수를 사용해 4칸 전진시켜 다섯 번째 요소를 가리킵니다. 이후 erase()에 두 반복자를 전달하여 인덱스 0부터 4 사이 범위의 요소들을 삭제하고 결과를 출력합니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
// 리스트 생성
list<int> myList;
myList.push_back(2);
myList.push_back(4);
myList.push_back(6);
myList.push_back(8);
myList.push_back(10);
cout<<"요소 삭제 전 리스트: ";
for (auto i = myList.begin(); i!= myList.end(); i++){
cout << *i << " ";
}
// 첫 번째 요소를 가리키는 반복자
list<int>::iterator i_1, i_2;
i_1 = myList.begin();
i_2 = myList.begin();
// advance() 함수로 반복자 2의 위치를 4만큼 증가
advance(i_2, 4);
// 이제 0~4 범위의 요소들이 삭제됨
myList.erase(i_1, i_2);
// 요소 삭제 후 리스트 출력
cout<< "\n요소 삭제 후 리스트: ";
for (auto i = myList.begin(); i!= myList.end(); i++){
cout << *i << " ";
}
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
요소 삭제 전 리스트: 2 4 6 8 10 요소 삭제 후 리스트: 10
마무리
C++ STL의 list::erase() 함수는 반복자를 기반으로 리스트의 요소를 손쉽게 삭제할 수 있는 강력한 도구입니다. 단일 위치를 지정하면 해당 요소 하나만 삭제되고, 시작 위치와 끝 위치를 함께 지정하면 범위 내의 모든 요소가 한 번에 제거됩니다. 리스트는 이중 연결 리스트 구조이기 때문에 중간 위치의 삭제 작업도 효율적으로 처리할 수 있으며, 삭제 후에는 유효한 다음 위치의 반복자가 반환된다는 점을 기억해 두면 좋습니다.