Language/C++

[C++] 35.Unmanaged Programming: Map

coco_daddy 2024. 1. 31. 02:13

C++ Map에 대한 이해

맵(Map)이란?

맵은 키와 값을 저장하는 데이터 구조로, 키와 값의 쌍을 저장합니다. 여러 가지 특징을 갖고 있으며, 주로 중복되지 않는 키를 통해 값을 찾는 데 사용된다.

  • 키와 값의 쌍을 저장한다.
  • 키는 중복될 수 없다.
  • C++ 맵은 자동 정렬되는 컨테이너이다. (키를 기준으로 정렬)
  • 이진 탐색 트리(binary search tree) 기반으로 구현되어 있어 검색 속도가 빠르다.

맵의 사용 예시

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

simpleScoreMap.insert(std::pair<std::string, int>("Coco", 100));
simpleScoreMap.insert(std::pair<std::string, int>("Mocha", 50));

simpleScoreMap["Mocha"] = 0;

std::pair<key, value>

std::pair는 두 데이터를 한 쌍으로 저장하는 구조체입니다. 맵에서는 주로 키와 값을 쌍으로 저장하는 데 사용된다.

맵의 기본 사용법

1. insert()

  • 새 요소를 map에 삽입한다.
  • 반복자와 bool값을 반환한다.
    • 반복자는 요소를 가리키고 있다.
    • bool값은 삽입 결과를 알려준다.
  • 키를 중복으로 삽입할 수 없다.
// <iterator, true> 반환
simpleScoreMap.insert(std::pair(std::pair<std::string, int>("Mocha", 100));

// <iterator, false> 반환
simpleScoreMap.insert(std::pair(std::pair<std::string, int>("Mocha", 100));

2. operator[]

  • key에 대응하는 값을 참조로 반환한다.
  • map에 키가 없으면 새 요소를 삽입한다.
  • map에 키가 이미 있으면 그 값을 덮어쓴다.
std::map<std::string, int> simpleScoreMap;

simpleScoreMap["Coco"] = 10; // 새 요소를 삽입함
simpleScoreMap["Coco"] = 50; // "Coco"의 값을 덮어씀

3. 자동 정렬과 키로 요소 찾기

  • 자동으로 정렬된다.
  • 키값으로 요소를 찾을 수 있다.
std::map<std::string, int>::iterator it = simpleScoreMap.find("Mocha");
if (it != simpleScoreMap.end())
    it->second = 80;

기타 맵의 함수들

  • swap(), clear(): 두 맵의 키를 바꾸는 함수와 map을 비우는 함수.
  • erase(): map의 요소를 제거하는 함수.
void erase(iterator position);
size_type erase(const key_type& key);
void erase(iterator first, iterator last);

맵의 장점과 단점

장점:

  • std::list, std::vector보다 탐색 속도가 더 빠르다.

단점:

  • 자동으로 정렬되어, 원하는 순서로 저장되지 않는다.
  • 해쉬맵이 아니므로 O(1)이 아닌 경우가 있다.
  • C++11에 해결책이 있다.