💡 Map
map은 각 노드가 key-value 쌍으로 이루어진 트리이며, 키의 중복을 허용하지 않는다는 점이 특징이다. map은 pair객체로 저장이 되고, first↔key, second↔value 이다. C++에서 map은 탐색, 삽입, 삭제가 모두 O(logN)에 이루어질 수 있는 레드블랙트리로 구현되어 있다.
Map의 기본 형태
map<key, value> m;
Map의 정렬
map은 자료를 저장할 때 내부적으로 자동으로 정렬하는 특징을 가지고 있다. 이 때 기준은 key값이 되고 오름차순으로 정렬하게 된다. 내림차순으로 정렬하고 싶은경우 2가지 방법으로 할 수 있다.
- map<int, int, greater> map1; 처럼 선언할 때 세 번째 인자로 greater를 추가하는 방법
- int데이터를 저장할 경우에만 해당되는 것인데 데이터를 음수화하여 저장하는 방법
💡 Map 사용방법
map 선언
map의 기본 구조는 map<key type, value type> 이름이다.
map<string, int> map1;
탐색
map에서 데이터를 탐색하기 위해서는 find() 메서드를 사용한다. 있는 데이터를 찾으면 해당 데이터의 iterator를 반환하고 만약 없다면 map.end()를 반환한다. 이 때 인자로 key값을 주어야 탐색이 가능하다.
그래서 map에 데이터가 있는지 찾는 방법은 다음과 같다.
// 데이터가 있는 경우
if(map1.find("hello") == map1.end()) {
cout << "found!";
}
// 데이터가 없는 경우
else {
cout << "Not found!";
}
삽입
map에 데이터를 추가하기 위해서는 insert() 메서드를 사용한다. map은 중복을 허용하지 않기 때문에 이미 있는 key값을 추가하려고 하면 insert되지 않는다. 그래서 map에 데이터를 추가하는 방법은 다음과 같다.
map1.insert({"number", 3});
삭제
map에서 데이터를 삭제하기 위해서는 erase() 와 clear() 메서드를 사용할 수 있다. erase() 메서드는 특정 요소를 선택하여 삭제할 수 있고, clear() 메서드는 map에 있는 모든 요소를 삭제할 수 있다.
- 특정 위치의 요소 삭제
// 두 번째 요소 삭제
map1.erase(map1.begin() + 2);
- key값을 기준으로 삭제
map1.erase("hello");
- 모든 요소 삭제
map1.erase(map1.begin(), map1.end());
map1.clear()
값 수정
map에 이미 있는 데이터의 값을 수정하기 위해서는 배열처럼 사용하면 된다. 이 때 [] 안에는 인덱스가 아니라 키 값을 넣어주어야 한다
map1["number"] = 5;
반복문 사용
반복문을 사용하여 map에 있는 모든 요소들을 출력하기 위한 방법은 인덱스로 접근하는 방법, 범위 기반 반복문을 사용하는 방법으로 두 가지가 있다.
- 인덱스 접근 방법
for(auto iter = map1.begin(); iter != map1.end(); iter++) {
cout << iter.first << " " << iter.second << endl;
}
- 범위 기반 반복문
for(auto iter : map1) {
cout << iter.first << " " << iter.second << endl;
}
value값으로 정렬하기(벡터로 변경)
때에따라 key값을 기준으로 정렬되어 있는 map을 value값을 기준으로 정렬이 필요할 때가 있다. 이러한 경우 map을 벡터로 변환하고 비교함수를 생성해준 뒤 algorithm 헤더의 sort함수를 이용하면 된다.
// sort에 사용하는 비교함수
bool comp(pair<int, int> a, pair<int, int> b) {
if(a.second > b.second) return true;
return false;
}
// map → vector 변경
vector<pair<int, int>> seq(map1.begin(), map1.end());
// 재정렬
sort(seq.begin(), seq.end(), comp);
정리
- 탐색, 삽입, 삭제가 모두 O(logN)에 이루어진다.
- 데이터 저장 시 key기준 오름차순으로 정렬된다.
참고
[1] https://unluckyjung.github.io/cpp/2020/05/07/Sort_map_by_value/