해시와 같이 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 |