SKYLIGHT STUDIO

[C++ 리바이브] Map 본문

Computer Programming/Coding Test(C++)

[C++ 리바이브] Map

SKY_L 2024. 10. 30. 07:15

우리의 독립은 아프리카 대륙의 완전한 해방과 연결되지 않는 한 무의미합니다! - 콰메 은크루마. 1957


Map은 C++의 연관 컨테이너( associative container) 중 하나로, 키-값 쌍(key-value pair)을 저장하고 키를 통해 값에 접근하는 자료구조 중 하나이다. 다른 연관 컨테이너로는 또 멀티맵이나 해시 테이블, unordered_map 뭐 많다.

보통 이런 종류의 자료구조는 파이썬의 딕셔너리를 통해 많이들 접하게 된다. Map도 C++에서 쓰기 편한 연관 컨테이너라는 점에서 공통점이 많긴 하나, 세부적인 차이점도 꽤 있다.

 

특성 Map Dictionary
중복 키 자동 오름차순 정렬 정렬되지 않음. 입력 순서
정렬 여부 허용하지 않음 허용하지 않음
검색속도 O(logn) O(1) (해시 테이블)
키의 타입 컴파일 시 지정해야 함 다양한 타입
예외 처리 at()은 예외 발생, []은 새 항목 추가 KeyError
내부 구조 균형 이진 탐색 트리(Red-Black Tree) 해시 테이블
멀티스레드 안정성 멀티스레드 환경에서 불안정함 GIL로 인한 일부 제약

 

역할은 비슷하지만 기반 자체가 다르다.


 

기본 사용법

#include <iostream>
#incldue <map>
#include <string>

using namespace std;

int main() {
	map<string, int> score;
    
    // 요소 추가
    score["Alice"] = 90;
    score["Bob"] = 85;
    score["Charlie"] = 95;
    
    // 요소 접근
    cout << score["Alice"] << endl;
    
    // 순회
    for (const auto& pair : score) {
        cout << pair.first << ": " << pair.second << endl;
    }

	return 0;
}

 

score["Alice"] = 90;에서 Alice가 Key이고, 90이 Value인 것.

요소 순회는 C++11에서 도입된 범위 기반 for 루프(range-based for loop)을 사용하면 편리하다.


메소드

 

Insert()

students.insert({3, "Charlie"});

 

이번엔 Key가 3, Value가 Charlie. 아까 score["Alice"] = 90;와 같은 역할이다.

당연하게도 Key가 이미 존재할 경우 삽입이 무시된다.

 

요소 제거(erase)

students.erase(3);

 

패러미터로 들어온 키의 요소를 제거한다.

 

요소 찾기

auto it = students.find(2);
if (it != students.end()) {
    cout << "Found: " << it->second << endl;
} else {
    cout << "Not found" << endl;
}

find() 구문

operator[] vs at()

cout << students[2] << endl;  // 키 2의 값 출력

// at()은 예외를 던지지만 [] 연산자는 새 요소를 생
cout << students.at(2) << endl;  // 존재하지 않으면 예외 발생

예외처리가 필요하면 at()을 사용할 것.

 

 

 

 

 

'Computer Programming > Coding Test(C++)' 카테고리의 다른 글

[C++ 리바이브] 범위 기반 for 루프  (0) 2024.11.02
[C++][1773] 폭죽쇼  (1) 2024.10.08
[C++/1076] 저항  (0) 2024.10.08
[C++][2547] 사탕 선생 고창영  (1) 2024.10.02
[C++ 리바이브] C++ 동적 배열  (0) 2024.10.02