Map 기본 사용법 및 예제
map의 개념
- 유일한 키와 하나의 값 쌍으로 저장하는 자료구조입니다.
- c++의 map의 내부 구현은 검색, 삽입, 삭제가 O(logN)인 레드 블랙 트리로 구성되어 있습니다.
- 자료를 pair 형태로 저장하고, 내부에서 키 값을 기준으로 자동으로 오름차순 정렬합니다.
map 사용법
map 헤더 파일 포함
#include <map>
- map을 사용하기 위해서는 map 헤더 파일을 include해주어야 합니다.
map 생성
map<KEY, VALUE> m
- KEY, VALUE 자리에 키로 사용할 자료형과 값으로 사용할 자료형을 넣습니다.
정렬 기준 병경
map<KEY, VALUE, greater<KEY>> m;
- key를 기준으로 기본 오름차순 이지만 greater를 사용하면 내림차순으로 바꿀 수 있습니다.
map 기본 함수
| 함수 | 설명 |
|---|---|
| m.insert(pair) | 맵에 ‘키’와 ‘값’으로 구성된 pair 객체 삽입 |
| m.at(key) | 맵에서 ‘키’ 값에 해당하는 ‘값’ 반환 |
| m[key] | 맵에서 ‘키’ 값에 해당하는 원소를 찾아 ‘값’ 반환 |
| m.begin() | 맵의 첫 번째 원소에 대한 참조 반환 |
| m.end() | 맵의 마지막 원소 다음을 가리키는 참조 반환 |
| m.find(key) | 맵에서 ‘키’ 값에 해당하는 원소를 가리키는 iterator 반환 |
| m.erase(iter) | 맵에서 iter가 가리키는 원소 삭제 |
| m.clear() | 맵에 들어있는 모든 원소 제거 |
| m.emtpy() | 맵이 비어 있으면 true 반환 |
| m.size() | 맵에 들어 있는 원소의 개수 반환 |
map 기본 사용 예시
map에 데이터 삽입
// 원소 추가
m.insert({ "A",4 });
m.insert({ "a",2 });
m.insert({ "F",3 });
// []을 사용하여 키 "A"의 값을 변경
// 키 "D"인 원소가 없으므로 생성한 뒤 기본값에서 1을 더한다.
m["A"] = 10;
m["D"]++;
- m.insert(pair) 함수를 통해서 원소를 추가할 수 있습니다.
- m[key]를 사용해서 생성되지 않은 원소를 생성할 수 있습니다.
데이터 접근
인덱스 접근
cout << "m[key]로 접근: " << m["A"] << "\n";
cout << "m.at[key]로 접근: " << m.at("D") << "\n";
cout << "생성하지 않은 인덱스 접근: " << m["C"] << "\n";
- m[key]이나, m.at(key) 함수를 사용해서 map에 접근할 수 있습니다.
- 생성하지 않은 키로 접근했을 때 m[key]는 0으로 출력되지만, m.at(key)는 예외가 발생합니다.
반복문 데이터 접근1
// 반복문 데이터 접근
for (pair<string, int> iter : m)
cout << "key: " << iter.first << ", value: " << iter.second << "\n";
- pair를 사용해서 map에 원소를 접근할 수 있습니다.
반복문 데이터 접근2
for (auto iter = m.begin(); iter != m.end(); iter++)
cout << "key: " << iter->first << ", value: " << iter->second << "\n";
- iterator를 활용하여 begin()부터 end()까지 map에 원소를 접근할 수 있습니다.
데이터 탐색
// 검색
cout << "key: F" << " 인 value 검색: ";
cout << m.find("F")->second << "\n";
- m.find(key) 함수를 통해서 map에 있는 원소를 접근할 수 있습니다.
데이터 삭제
key값을 가진 노드 삭제
// key: A인 원소를 제거
m.erase("A");
- m.erase(key) 함수를 통해서 특정 키를 가진 원소를 제거할 수 있습니다.
모든 데이터 삭제
// map에 모든 원소 제거
m.clear();
- m.clear() 함수를 통해서 map에 모든 원소를 제거할 수 있습니다.
map의 크기
// size()
cout << "map의 원소의 개수: " << m.size() << "\n";
- m.size() 함수를 통해서 map에 있는 원소의 개수를 알 수 있습니다.
전체 코드
#include <iostream>
#include <map>
using namespace std;
int main() {
// map 선언
map<string, int> m;
// 원소 추가
m.insert({ "A",4 });
m.insert({ "a",2 });
m.insert({ "F",3 });
// []을 사용하여 키 "A"의 값을 변경
// 키 "D"인 원소가 없으므로 생성한 뒤 기본값에서 1을 더한다.
m["A"] = 10;
m["D"]++;
cout << "m[key]로 접근: " << m["A"] << "\n";
cout << "m.at[key]로 접근: " << m.at("D") << "\n";
cout << "생성하지 않은 인덱스 접근: " << m["C"] << "\n";
cout << "\n";
// 반복문 데이터 접근
for (pair<string, int> iter : m)
cout << "key: " << iter.first << ", value: " << iter.second << "\n";
cout << "\n";
// 검색
cout << "key: F" << " 인 value 검색: ";
cout << m.find("F")->second << "\n";
// size()
cout << "map의 원소의 개수: " << m.size() << "\n";
cout << "\n";
// key: A인 원소를 제거
m.erase("A");
for (auto iter = m.begin(); iter != m.end(); iter++)
cout << "key: " << iter->first << ", value: " << iter->second << "\n";
// map에 모든 원소 제거
m.clear();
if (m.empty()) cout << "맵이 비어있습니다.\n";
else cout << "맵이 비어있지 않습니다.\n";
return 0;
}
- 결과
m[key]로 접근: 10
m.at[key]로 접근: 1
생성하지 않은 인덱스 접근: 0
key: A, value: 10
key: C, value: 0
key: D, value: 1
key: F, value: 3
key: a, value: 2
key: F 인 value 검색: 3
map의 원소의 개수: 5
key: C, value: 0
key: D, value: 1
key: F, value: 3
key: a, value: 2
맵이 비어있습니다.