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

STL 멀티맵(Multimap)을 활용한 C++ 프로그래밍 완벽 가이드

멀티맵(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으로 줄어든 결과를 출력합니다.