Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL multimap::erase() 함수 완벽 가이드 – 문법과 예제 총정리

이 글에서는 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)의 시간 복잡도로 효율적으로 수행됩니다. 다만 반복자로 삭제할 때는 이미 삭제된 요소를 가리키는 반복자를 재사용하지 않도록 주의해야 안전한 코드를 작성할 수 있습니다.