맵(map)은 데이터를 키(key)와 값(value) 쌍의 형태로 저장하는 자료구조입니다. C++에서 맵은 STL(표준 템플릿 라이브러리)에 정의되어 있으며, 키를 항상 정렬된 상태로 유지한다는 특징이 있습니다.
맵을 정의하는 기본 문법은 다음과 같습니다.
map<key_type, value_type> map_name;
맵의 키와 값에는 int, float, char 같은 기본 데이터 타입뿐만 아니라 배열이나 구조체와 같은 파생 데이터 타입도 사용할 수 있습니다.
특히 사용자 정의 데이터 타입도 맵의 키로 활용할 수 있습니다. 다만 맵은 내부적으로 키를 정렬하여 관리하기 때문에, 해당 타입에 대한 비교 연산자(operator<)가 반드시 정의되어 있어야 합니다.
사용자 정의 데이터 타입 정의하기
struct key {
float f;
}이렇게 직접 정의한 데이터 타입을 맵의 키로 사용하면, 단순한 숫자나 문자열 대신 여러 정보를 함께 담는 복합적인 키를 만들 수 있어 더욱 의미 있는 데이터 집합을 구성할 수 있습니다. 구조체(struct)에는 배열이나 다른 자료구조까지 포함해 원하는 만큼 많은 멤버 변수를 선언할 수 있습니다.
예제 코드
다음 예제는 float형 멤버를 가진 구조체를 맵의 키로 사용하는 방법을 보여줍니다.
#include <bits/stdc++.h>
using namespace std;
struct kdata {
float id;
};
// kdata 타입 간의 크기 비교 연산자 정의
bool operator<(const kdata& t1, const kdata& t2) {
return (t1.id < t2.id);
}
int main() {
kdata t1 = { 4.5 }, t2 = { 12.3 }, t3 = { 67.8 }, t4 = { 65.2 };
map<kdata, char> maps;
maps[t1] = 'a';
maps[t2] = 'h';
maps[t3] = 'm';
maps[t4] = 'q';
cout << "The map data is" << endl;
for (auto x : maps)
cout << x.first.id << " > " << x.second << endl;
return 0;
}
실행 결과
The map data is
4.5 > a
12.3 > h
65.2 > q
67.8 > m
실행 결과를 보면 키 값(id)을 기준으로 오름차순으로 정렬되어 출력되는 것을 확인할 수 있습니다. 이는 std::map이 내부적으로 균형 이진 탐색 트리(레드-블랙 트리)를 사용해 키를 항상 정렬된 상태로 유지하기 때문입니다. 따라서 사용자 정의 타입을 키로 사용할 때는 반드시 operator<를 올바르게 구현해 주어야 합니다.