본문 바로가기

C++/STL

[C++/STL] map, unordered_map

해시와 같이 Key와 Value의 쌍으로 문제를 해결해야 할 경우가 있습니다. C++에서 이를 도와주는 것들이 바로, map과 unordered_map입니다. 더 넓혀 본다면 multimap과 unordered_multimap도 있겠네요.

 

map과 unordered_map의 차이점은 키를 정렬하느냐 마느냐입니다. map은 정해진 정렬 기준(기본값은 오름차순입니다.)에 따라 정렬됩니다. undordered_map은 정렬을 하지 않습니다.

 

map과 multimap의 차이점은 키를 중복으로 가질 수 있느냐 없느냐입니다. map은 유일한 단 하나의 키만 가질 수 있지만, multimap은 여러 키를 중복이 가능하다는 것입니다.

 

이를 제외한 멤버 함수의 사용법 등은 모두 동일합니다. 그러므로, map을 기준으로 글을 이어 나가보도록 하겠습니다.

 


 

 

#Include <map>

map(또는 unordered_map) 헤더파일만 선언해주면 multimap(또는 unordered_multimap)을 같이 사용할 수 있습니다.

#include <map>		 // map과 multimap
#include <unordered_map> // unordered_map과 unordered_multimap
template < class Key, class T, class Compare = less<Key>, class Alloc = allocator<pair<const Key,T>>> class map;

 

Key의 자료형, Value의 자료형 순서대로 선언해줍니다.

 

선언 방법

map<int, int> m1;    // Key가 int형, value가 int형
map<string, int> m2; // key가 string형, value가 int형

 


 

멤버 함수 목록

 

1. Iterators(반복자)

begin() : 맵의 첫번째 요소를 가리키는 반복자입니다.
end() : 맵의 마지막 요소 뒤를 가리키는 반복자입니다.
rbegin(), rend() : begin()과 end()의 역순입니다.
cbegin(), cend(), crbegin(), crend() : 각각의 반복자를 const_iterators로 받아옵니다.

 


 

2. Capacity(용량)

empty() : 맵이 비어있는지 확인합니다.
size() : 맵의 현재 크기(요소의 수)를 반환합니다.
max_size() : 맵의 최대 크기를 반환합니다.

 


 

3. Element access(요소 접근)

operator[] : Key와 일치하는 요소를 찾아 매핑된 값에 대한 참조를 반환합니다.
at() : 위와 동일합니다. 차이점은, []연산자는 요소가 없다면 요소를 생성하지만, at()는 예외를 발생시킵니다.

 

예시

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

using namespace std;

int main() {
    map<string, int> m1;
    map<string, int>::iterators iter;
    
    m1["Apple"] = 1;
    m1["Blueberry"] = 2;
    m1["Cherry"] = 3;
    
    cout << m1.size() << endl; // 출력 : 3
    
    for (iter = m1.begin(); iter != m1.end(); iter++) {
        cout << iter->first << " : " << iter->second << endl;
    }
    // 출력
    // Apple : 1
    // Blueberry : 2
    // Cherry : 3
    
    return 0;
}

 


 

4. Modifiers(수정자)

insert : 요소를 삽입합니다.
1. insert(const value_type& val) : key-value 쌍의 요소를 삽입합니다.
2. insert(iterator position, const value_type& val) : position에 요소를 삽입합니다. 어차피 정렬이 될 텐데 왜 필요한가 싶지만, 해당 요소가 정렬 후 위치할 곳을 예상해 삽입한다면 소요 시간을 줄일 수 있습니다.
3. insert(InputIterator first, InputIterator last) : first와 last 이전까지의 요소를 복사해 맵에 삽입합니다.

erase : 요소를 삭제합니다.
1. erase(iterator position) : position에 있는 요소를 삭제합니다.
2. erase(const key_type& k) : key가 k인 요소를 삭제합니다. 멀티맵의 경우, k에 해당하는 모든 요소를 삭제합니다.
3. erase(iterator first, iterator last) : first와 last 이전까지의 요소를 삭제합니다.

swap() : 두 맵을 서로 바꿉니다.
clear() : 맵의 모든 요소를 제거합니다.
emplace(Args&&... args) : 요소를 추가합니다.
emplace_hint(const_iterator position, Args&&... args) : poistion에 요소를 추가합니다.

 

예시

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

using namespace std;

int main() {
    map<string, int> m1;
    map<string, int>::iterators iter = m1.begin();
    
    m1.insert(pair<string, int>("Apple", 1));
    
    m1.insert(iter, pair<string, int>("Blueberry", 2));
    m1.insert(iter, pair<string, int>("Cherry", 3));
    
    map<string, int> m2;
    m2.insert(m1.begin(), m1.end());
    
    for (iter = m2.begin(); iter != m2.end(); iter++) {
        cout << iter->first << " : " << iter->second << endl;
    }
    // 출력
    // Apple : 1
    // Blueberry : 2
    // Cherry : 3
    
    return 0;
}

 


 

5. 그 외

key_comp(), value_comp() : 각각 key, value를 비교하는 데 사용되는 비교 객체를 복사해 반환합니다.
find() : 요소들에서 key를 찾아 위치에 대한 반복자를 반환합니다.
count() : 요소들에서 key를 찾아 그 수를 반환합니다.
lower_bound() : 요소들에서 key를 찾아 그 이전 위치에 대한 반복자를 반환합니다.
upper_bound() : 요소들에서 key를 찾아 그 다음위치에 대한 반복자를 반환합니다.
equal_range() : 요소들에서 key를 찾아 그 범위를 pair<lower_bound, upper_bound>로 반환합니다.

 

 

 

Reference

https://www.cplusplus.com/reference/map/

 

 

 

 

 

 

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

[C++/STL] deque (덱)  (0) 2022.04.12
[C++/STL] vector (벡터)  (0) 2022.04.11
[C++/STL] priority_queue (우선순위 큐)  (1) 2022.04.05
[C++/STL] queue (큐)  (0) 2022.04.01
[C++/STL] stack (스택)  (0) 2022.03.31