상세 컨텐츠

본문 제목

C++ STL Map 사용법 및 실전 활용

Study/C++

by mangirl 2025. 1. 10. 11:45

본문

std::map은 C++ 표준 라이브러리에서 제공하는 연관 컨테이너 중 하나로, **키-값 쌍(key-value pair)**을 효율적으로 저장하고 관리할 수 있는 자료구조입니다. 이번 포스트에서는 std::map의 주요 특징, 사용법, 그리고 실무에서의 활용 예제를 소개하겠습니다.


🧩 std::map이란?

std::map은 **키(key)**와 **값(value)**을 연관시켜 저장하는 정렬된 연관 컨테이너입니다. 키를 기준으로 자동으로 정렬되며, **이진 검색 트리(Red-Black Tree)**를 기반으로 구현되어 있어 탐색, 삽입, 삭제가 **O(log n)**의 시간 복잡도를 가집니다.

✅ 주요 특징

  • 키는 유일해야 함 (중복 키 허용하지 않음)
  • 자동 정렬: 키 값을 기준으로 오름차순으로 정렬됨
  • 빠른 검색 속도: O(log n)의 탐색 시간 복잡도

🛠 std::map 기본 사용법

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> scores;

    // 값 삽입
    scores["Alice"] = 90;
    scores["Bob"] = 85;
    scores["Charlie"] = 88;

    // 값 출력
    for (const auto& pair : scores) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 특정 키 검색
    std::string name = "Alice";
    if (scores.find(name) != scores.end()) {
        std::cout << name << "의 점수: " << scores[name] << std::endl;
    }

    return 0;
}

📋 출력 결과

Alice: 90
Bob: 85
Charlie: 88
Alice의 점수: 90

🔄 주요 함수와 메서드

함수/메서드설명

insert() 키-값 쌍을 삽입합니다.
find() 특정 키를 검색합니다.
erase() 특정 키를 삭제합니다.
size() map에 저장된 요소의 개수를 반환합니다.
clear() 모든 요소를 삭제합니다.
empty() map이 비어 있는지 확인합니다.

✅ 예제: insert와 find 사용법

std::map<int, std::string> students;

students.insert({1, "Alice"});
students.insert({2, "Bob"});
students.insert({3, "Charlie"});

if (students.find(2) != students.end()) {
    std::cout << "학생 번호 2: " << students[2] << std::endl;
}

⚙️ 실무 활용: I/O 매핑 설정

실제 프로젝트에서 std::map을 활용하여 I/O 매핑 설정을 관리하는 예제를 살펴보겠습니다.

🎯 요구사항

  • 경광등 I/O 맵핑 설정을 Red, Yellow, Green, Blue로 관리
  • 기본값을 제공하고, 사용자가 INI 파일을 통해 설정을 변경 가능하도록 구현

✅ 코드 구현

1️⃣ I/O 매핑 관리 클래스 (CIOSettingManager)

#include <map>
#include <string>
#include <iostream>
#include <Windows.h>

class CIOSettingManager {
private:
    std::map<std::string, int> m_mapIOBitNum;

public:
    CIOSettingManager() {
        // 기본값 설정
        m_mapIOBitNum["Red"] = 1;
        m_mapIOBitNum["Yellow"] = 2;
        m_mapIOBitNum["Green"] = 3;
        m_mapIOBitNum["Blue"] = 4;
    }

    void LoadFromINI(const std::string& iniFilePath) {
        char buffer[256];
        for (const auto& pair : m_mapIOBitNum) {
            GetPrivateProfileString("IOMapping", pair.first.c_str(), std::to_string(pair.second).c_str(), buffer, sizeof(buffer), iniFilePath.c_str());
            m_mapIOBitNum[pair.first] = std::stoi(buffer);
        }
    }

    void PrintMappings() {
        for (const auto& pair : m_mapIOBitNum) {
            std::cout << pair.first << ": " << pair.second << std::endl;
        }
    }
};

2️⃣ 사용 예제

int main() {
    CIOSettingManager ioManager;

    // INI 파일에서 설정 값 로드
    ioManager.LoadFromINI("settings.ini");

    // 매핑 정보 출력
    ioManager.PrintMappings();

    return 0;
}

📋 출력 결과 (settings.ini가 없는 경우)

Red: 1
Yellow: 2
Green: 3
Blue: 4

📋 출력 결과 (settings.ini가 있는 경우)

Red: 10
Yellow: 20
Green: 30
Blue: 40

🔎 정리

std::map키-값 쌍을 관리하고, 빠른 검색이 필요한 상황에서 매우 유용한 컨테이너입니다. 특히 실무에서 I/O 매핑 설정과 같은 작업에서 자주 활용되며, INI 파일과 연동하여 사용자 설정을 유연하게 관리할 수 있습니다.

std::map을 활용하면 더 효율적인 프로그램을 개발 가능합니다.

'Study > C++' 카테고리의 다른 글

C++에서의 ThreadPool 활용과 기존 Thread 생성 방식 비교  (0) 2024.04.30

관련글 더보기