이 글에서는 C++ STL에서 multimap::erase() 함수의 동작 방식, 문법, 그리고 다양한 활용 예제를 자세히 살펴보겠습니다.
C++ STL에서 멀티맵(multimap)이란?
멀티맵은 map 컨테이너와 유사한 연관 컨테이너(associative container)입니다. 키(key)와 이에 대응하는 값(mapped value)으로 구성된 요소들을 특정 순서대로 저장할 수 있으며, 일반 map과 달리 동일한 키에 여러 개의 요소를 연결할 수 있다는 점이 큰 특징입니다. 저장된 데이터는 내부적으로 항상 키를 기준으로 자동 정렬됩니다.
multimap::erase()란 무엇인가?
multimap::erase()는 C++ STL에 내장된 함수로, <map> 헤더 파일에 정의되어 있습니다. 이름 그대로 멀티맵 컨테이너에서 요소를 제거(삭제)하는 역할을 합니다.
이 함수는 키, 반복자(위치), 또는 지정된 범위 세 가지 방식으로 요소를 삭제할 수 있습니다. 함수가 실행되면 삭제된 요소 수만큼 컨테이너의 크기(size)가 줄어듭니다.
문법(Syntax)
multimap_name.erase(key_type key); multimap_name.erase(const_iterator it); multimap_name.erase(const_iterator start, const_iterator end);
매개변수
erase() 함수는 아래 매개변수를 받을 수 있습니다.
key − 삭제하고자 하는 요소의 키 값입니다.
it − 삭제할 요소를 가리키는 반복자 위치입니다.
start, end − 삭제할 요소 범위의 시작 위치와 끝 위치를 나타냅니다.
반환값
키(key)로 삭제하는 경우 해당 함수는 제거된 요소의 개수를 반환합니다.
입력 예시
std::multimap<char, int> mymap;
mymap.insert({'a', 10});
mymap.insert({'b', 20});
mymap.insert({'c', 30});
mymap.erase('b');
출력 결과
a:10 c:30
예제 1: 지정한 키의 요소 삭제하기
#include<iostream>
#include<map>
using namespace std;
int main(){
multimap<int,char> mul_1;
// 요소를 순회하기 위한 반복자 선언
multimap<int,char>::iterator i;
// multimap1에 요소 삽입
mul_1.insert(make_pair(0,'a'));
mul_1.insert(make_pair(1,'b'));
mul_1.insert(make_pair(2,'c'));
mul_1.insert(make_pair(3,'d'));
mul_1.insert(make_pair(4,'e'));
mul_1.insert(make_pair(5,'f'));
mul_1.insert(make_pair(6,'g'));
// erase() 호출로 요소 삭제
mul_1.erase(1);
mul_1.erase(4);
mul_1.erase(6);
mul_1.erase(5);
// multimap1의 요소 출력
cout<<"Elements in multimap1 are: "<<"\n";
for(i = mul_1.begin(); i != mul_1.end(); i++){
cout<<(*i).first<<" "<< (*i).second << "\n";
}
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Elements in multimap1 are: 0 a 2 c 3 d
키 1, 4, 5, 6에 해당하는 요소들이 모두 삭제되고 나머지 요소만 남아있는 것을 확인할 수 있습니다.
예제 2: 지정한 범위 내의 요소 삭제하기
#include<iostream>
#include<map>
using namespace std;
int main(){
multimap<int,char> mul_1;
// 요소를 순회하기 위한 반복자 선언
multimap<int,char>::iterator i;
// multimap1에 요소 삽입
mul_1.insert(make_pair(0,'a'));
mul_1.insert(make_pair(1,'b'));
mul_1.insert(make_pair(2,'c'));
mul_1.insert(make_pair(3,'d'));
mul_1.insert(make_pair(4,'e'));
mul_1.insert(make_pair(5,'f'));
mul_1.insert(make_pair(6,'g'));
// 삭제 전 multimap의 요소 출력
cout<<"Elements in multimap1 are: "<<"\n";
for(i = mul_1.begin(); i != mul_1.end(); i++){
cout<<(*i).first<<" "<< (*i).second << "\n";
}
// erase() 호출로 범위 내 요소 삭제
auto start = mul_1.find(3);
auto end = mul_1.find(6);
mul_1.erase(start, end);
// 삭제 후 multimap1의 요소 출력
cout<<"Elements in multimap1 are: "<<"\n";
for(i = mul_1.begin(); i != mul_1.end(); i++){
cout<<(*i).first<<" "<< (*i).second << "\n";
}
}
실행 결과
Elements in multimap1 are: 0 a 1 b 2 c 3 d 4 e 5 f 6 g Elements in multimap1 are: 0 a 1 b 2 c 6 g
find(3)부터 find(6)까지의 범위가 삭제되면서 키 3, 4, 5에 해당하는 요소(d, e, f)가 제거되고, 끝 위치(end)에 해당하는 6:g는 남아있음을 알 수 있습니다. 즉, [start, end) 구간처럼 시작 위치는 포함하고 끝 위치는 포함하지 않습니다.
예제 3: 지정한 위치(반복자)의 요소 삭제하기
#include<iostream>
#include<map>
using namespace std;
int main(){
multimap<int,char> mul_1;
// 요소를 순회하기 위한 반복자 선언
multimap<int,char>::iterator i;
// multimap1에 요소 삽입
mul_1.insert(make_pair(0,'a'));
mul_1.insert(make_pair(1,'b'));
mul_1.insert(make_pair(2,'c'));
mul_1.insert(make_pair(3,'d'));
mul_1.insert(make_pair(4,'e'));
mul_1.insert(make_pair(5,'f'));
mul_1.insert(make_pair(6,'g'));
// 삭제 전 multimap의 요소 출력
cout<<"Elements in multimap1 are: "<<"\n";
for(i = mul_1.begin(); i != mul_1.end(); i++){
cout<<(*i).first<<" "<< (*i).second << "\n";
}
// erase() 호출로 특정 위치의 요소 삭제
auto first = mul_1.find(1);
mul_1.erase(first);
auto second = mul_1.find(6);
mul_1.erase(second);
auto third = mul_1.find(2);
mul_1.erase(third);
// 삭제 후 multimap1의 요소 출력
cout<<"Elements in multimap1 are: "<<"\n";
for(i = mul_1.begin(); i != mul_1.end(); i++){
cout<<(*i).first<<" "<< (*i).second << "\n";
}
}
실행 결과
Elements in multimap1 are: 0 a 1 b 2 c 3 d 4 e 5 f 6 g Elements in multimap1 are: 0 a 3 d 4 e 5 f
find()로 얻은 반복자가 가리키는 위치의 요소들(1:b, 6:g, 2:c)이 각각 삭제된 것을 확인할 수 있습니다.
정리
multimap::erase()는 키, 단일 위치(반복자), 범위 세 가지 방식으로 유연하게 요소를 삭제할 수 있는 강력한 함수입니다. 멀티맵은 내부적으로 균형 이진 탐색 트리(레드-블랙 트리)로 구현되어 있어, erase() 연산도 O(log n)의 시간 복잡도로 효율적으로 수행됩니다. 다만 반복자로 삭제할 때는 이미 삭제된 요소를 가리키는 반복자를 재사용하지 않도록 주의해야 안전한 코드를 작성할 수 있습니다.