[C++] Map

yeolife ㅣ 2023. 7. 4. 23:47

특징

#include <map>
#include <unordered_map>
  • 레드-블랙 트리 구조
  • <key, value> pair 쌍
  • key 값이 중복되지 않음
  • key 값을 기준으로 오름차순 정렬
  map multimap unordered_map
key 중복여부 중복 불가 중복 가능 중복 불가
정렬 O O X

 

생성

설명 코드
map 생성 map<string, int> m
map 안에 map 생성(value가 map) map<string, map<int,  int> > m

 

참조 및 반복자

설명 코드
첫번째 원소의 주소값 m.begin()
마지막 원소의 다음 주소값 m.end()
마지막 원소의 주소값을 시작점으로 설정 m.rbegin()
첫번째 원소의 주소값을 끝점으로 설정 m.rend()
begin()과 같지만 const로 설정 m.cbegin()
end()와 같지만 const로 설정 m.cend()
rbegin()과 같지만 const로 설정 m.crbegin()
rend()와 같지만 const로 설정 m.crend()

 

수정자

설명 코드
key를 가진 value 삽입 m.insert(make_pair(key, value))
key 원소 제거 m.erase(key)
begin과 end 범위 제거 m.erase(m.begin(), m.end())
모든 원소 제거 m.clear()
move()를 사용해 객체를 저장 m.emplace()
삽입될 위치에 대한 힌트를 토대로 삽입 m.emplace_hint()
m과 m2의 원소를 바꿈 m.swap(m2)

 

크기

설명 코드
map의 크기를 반환 m.size()
원소를 가질 수 있는 최대 크기를 반환 m.max_size()
map이 비어있으면 True, 아니면 False를 반환 m.empty()

 

연산

설명 코드
key 위치의 iter 반환
※ 존재하지 않으면 m.end()
m.find(key)
key의 개수
※ 중복이 없으니 0 또는 1
m.count(key)
key가 시작하는 구간의 반복자 m.lower_bound(key)
key가 끝나는 구간의 반복자 m.upper_bound(key)
key가 시작하고 끝나는 구간의 반복자 m.equal_range(key)

 

Value 기준으로 정렬하기

  • Map 내에서는 Value 값을 기준으로 정렬할 수 없기 때문에 번거롭지만 vector에 옮겨서 정렬해야 한다.
// Value 내림차순 정렬

bool cmp(const pair<string, int>& a, const pair<string, int>& b) {
      return a.second > b.second;
}

map<string, int> m;
vector<pair<string, int> > vec(m.begin(), m.end());

sort(vec.begin(), vec.end(), cmp);