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

C++ 맵(map)에서 사용자 정의 데이터 타입을 키로 사용하는 방법

맵(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<를 올바르게 구현해 주어야 합니다.