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

C++ STL 맵(Map) 구현 예제 – 주요 함수와 사용법 총정리

맵(Map)은 연관 컨테이너(associative container)로, 요소들을 키(key)와 값(value)이 대응되는 형태로 저장합니다. 각 요소는 키 값(key value)과 매핑된 값(mapped value)으로 구성되며, 동일한 키 값을 가지는 두 요소는 존재할 수 없습니다. 이 글에서는 C++ STL의 map 컨테이너를 선언하고, 요소를 삽입·검색·삭제하는 기본적인 방법을 예제 코드와 함께 살펴보겠습니다.

맵에서 사용되는 주요 멤버 함수

  • m.find() – 지정한 키(예: 'b')를 가진 요소를 찾아 해당 위치의 반복자(iterator)를 반환하며, 찾지 못할 경우 end() 반복자를 반환합니다.

  • m.erase() – 맵에서 특정 키 값에 해당하는 요소를 제거합니다.

  • m.equal_range() – 반복자의 쌍(pair)을 반환합니다. 이 쌍은 컨테이너 내에서 전달된 키와 동일한 키를 가진 모든 요소가 포함된 범위의 시작과 끝 경계를 가리킵니다.

  • m.insert() – 맵 컨테이너에 새로운 요소를 삽입합니다.

  • m.size() – 맵 컨테이너에 저장된 요소의 개수를 반환합니다.

  • m.count() – 특정 키(예: 'a' 또는 'f')와 일치하는 요소의 개수를 반환합니다. 맵은 중복 키를 허용하지 않으므로 결과는 항상 0 또는 1입니다.

예제 코드

#include<iostream>
#include <map>
#include <string>
using namespace std;
int main () {
    map<char, int> m;
    map<char, int>::iterator it;
    m.insert (pair<char, int>('a', 10));
    m.insert (pair<char, int>('b', 20));
    m.insert (pair<char, int>('c', 30));
    m.insert (pair<char, int>('d', 40));
    cout<<"Size of the map: "<< m.size() <<endl;
    cout << "map contains:\n";
    for (it = m.begin(); it != m.end(); ++it)
        cout << (*it).first << " => " << (*it).second << '\n';
    for (char c = 'a'; c <= 'd'; c++) {
        cout << "There are " << m.count(c) << " element(s) with key " << c << ":";
        map<char, int>::iterator it;
        for (it = m.equal_range(c).first; it != m.equal_range(c).second; ++it)
            cout << ' ' << (*it).second;
        cout << endl;
    }
    if (m.count('a'))
        cout << "The key a is present\n";
    else
        cout << "The key a is not present\n";
    if (m.count('f'))
        cout << "The key f is present\n";
    else
        cout << "The key f is not present\n";
    it = m.find('b');
    m.erase (it);
    cout<<"Size of the map: "<<m.size()<<endl;
    cout << "map contains:\n";
    for (it = m.begin(); it != m.end(); ++it)
    cout << (*it).first << " => " << (*it).second << '\n';
    return 0;
}

실행 결과

Size of the map: 4
map contains:
a => 10
b => 20
c => 30
d => 40
There are 1 element(s) with key a: 10
There are 1 element(s) with key b: 20
There are 1 element(s) with key c: 30
There are 1 element(s) with key d: 40
The key a is present
The key f is not present
Size of the map: 3
map contains:
a => 10
c => 30
d => 40

코드 설명

위 예제는 다음과 같은 순서로 동작합니다.

  1. 요소 삽입: insert()를 사용하여 문자 키(char)와 정수 값(int) 쌍 네 개를 맵에 추가합니다. 맵은 내부적으로 키를 기준으로 자동 정렬되므로, 출력 시 'a', 'b', 'c', 'd' 순서로 나타납니다.
  2. 전체 순회: begin()부터 end()까지 반복자를 이용해 모든 키와 값을 출력합니다.
  3. 범위 검색: equal_range()로 각 키에 해당하는 요소 범위를 얻어 값을 출력합니다. 맵은 중복 키를 허용하지 않으므로 각 키마다 요소가 하나씩만 조회됩니다.
  4. 키 존재 여부 확인: count()를 통해 키 'a'는 존재하고, 맵에 없는 키 'f'는 존재하지 않음을 확인합니다.
  5. 요소 삭제: find('b')로 키 'b'의 위치를 찾은 뒤 erase()로 삭제하면, 맵의 크기가 4에서 3으로 줄어들고 'b' 항목이 사라진 결과를 확인할 수 있습니다.

참고로, C++17부터는 구조적 바인딩(structured binding)을 활용해 for (auto& [key, value] : m) 형태로 더 간결하게 맵을 순회할 수 있습니다.