멀티맵(Multimap)은 map과 거의 유사하지만, 하나의 중요한 차이점이 있습니다. 바로 여러 개의 요소가 동일한 키(key)를 가질 수 있다는 점입니다. 다만 키와 매핑된 값으로 이루어진 쌍(pair) 자체는 멀티맵 내에서 유일해야 합니다.
이번 글에서는 STL의 멀티맵을 구현하고, 주요 멤버 함수들을 실제 코드로 살펴보겠습니다.
주요 멤버 함수
mm::find() – 멀티맵에서 지정한 키(예: 'b')를 가진 요소의 반복자(iterator)를 반환합니다. 찾지 못하면 end 반복자를 반환합니다.
mm::erase() – 멀티맵에서 해당 키의 요소를 제거합니다.
mm::equal_range() – 반복자 쌍(pair of iterators)을 반환합니다. 이 쌍은 컨테이너 내에서 해당 키와 동일한 키를 가진 모든 요소들의 범위 경계를 나타냅니다.
mm::insert() – 멀티맵 컨테이너에 새로운 요소를 삽입합니다.
mm::size() – 멀티맵 컨테이너에 저장된 요소의 개수를 반환합니다.
예제 코드
#include<iostream>
#include <map>
#include <string>
using namespace std;
int main () {
multimap<char, int> mm;
multimap<char, int>::iterator it;
mm.insert (pair<char, int>('a', 10));
mm.insert (pair<char, int>('b', 20));
mm.insert (pair<char, int>('b', 30));
mm.insert (pair<char, int>('a', 40));
cout<<"Size of the multimap: "<< mm.size() <<endl;
cout << "Multimap contains:\n";
for (it = mm.begin(); it != mm.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
for (char c = 'a'; c <= 'b'; c++) {
cout << "There are " << mm.count(c) << " elements with key " << c << ":";
multimap<char, int>::iterator it;
for (it = mm.equal_range(c).first; it != mm.equal_range(c).second; ++it)
cout << ' ' << (*it).second;
cout << endl;
}
it = mm.find('b');
mm.erase (it);
cout<<"Size of the multimap: "<<mm.size()<<endl;
cout << "Multimap contains:\n";
for (it = mm.begin(); it != mm.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
return 0;
}실행 결과
Size of the multimap: 4 Multimap contains: a => 10 a => 40 b => 20 b => 30 There are 2 elements with key a: 10 40 There are 2 elements with key b: 20 30 Size of the multimap: 3 Multimap contains: a => 10 a => 40 b => 30
코드 설명
위 예제에서는 문자(char) 타입의 키와 정수(int) 타입의 값을 갖는 멀티맵을 생성했습니다. 같은 키 'a'와 'b'에 대해 각각 두 개의 서로 다른 값이 삽입된 것을 확인할 수 있으며, 이것이 map과 멀티맵의 핵심적인 차이입니다.
equal_range() 함수를 사용하면 특정 키를 가진 모든 요소들을 순회할 수 있고, count() 함수로 해당 키를 가진 요소의 개수를 파악할 수 있습니다. 마지막에는 find()로 키 'b'를 가진 첫 번째 요소를 찾아 erase()로 삭제한 후, 크기가 3으로 줄어든 결과를 출력합니다.