0. 들어가기 전에
C++에서 map은 key와 value를 한 쌍으로 저장하는 자료구조이다. 쉽게 말하면,
map<키자료형, 값자료형> 변수명;
형태로 사용하며, 특정 key를 기준으로 value를 빠르게 찾을 때 사용한다.
// 예를 들어 이름별 점수를 저장한다면 다음과 같이 사용할 수 있다.
map<string, int> score;
score["kim"] = 90;
score["lee"] = 80;
이렇게 저장하면 "kim"이라는 이름을 통해 90이라는 점수를 가져올 수 있다.
1. map 기본 개념
- map 이란?
C++에서 map은 key와 value를 한 쌍으로 저장하는 자료구조이다. 쉽게 말하면,
map<키자료형, 값자료형> 변수명; 형태로 사용하며, 특정 key를 기준으로 value를 빠르게 찾을 때 사용한다. // 예를 들어 이름별 점수를 저장한다면 다음과 같이 사용할 수 있다. map<string, int> score; score["kim"] = 90; score["lee"] = 80; 이렇게 저장하면 "kim"이라는 이름을 통해 90이라는 점수를 가져올 수 있다. - map 사용하는 이유
map은 다음과 같은 상황에서 자주 사용한다.=> 어떤 값을 기준값(key) 으로 저장하고 나중에 다시 찾고 싶을 때 사용한다.
이름 -> 점수 상품명 -> 가격 문자열 -> 등장 횟수 번호 -> 이름
2. map 기본 사용법
- map 선언하기
map을 사용하려면 헤더를 포함해야 한다.
#include <map> 기본 선언 방식은 다음과 같다. map<key자료형, value자료형> 변수명; 예시이다. map<string, int> m; - 문자열(string) key - 정수(int) value - map에 값 저장하기
map에 값을 저장할 때는 대괄호 []를 사용한다.
map<string, int> m; m["apple"] = 1000; m["banana"] = 2000; m["orange"] = 3000;
위 코드는 다음과 같은 데이터를 저장한다.
(즉, "apple"이라는 key에는 1000이라는 value가 저장된다.)key value apple 1000 banana 2000 orange 3000 - map에서 값 가져오기
저장된 값은 key를 이용해서 가져올 수 있다.
cout << m["apple"]; //출력결과 1000 //전체 예시 코드 #include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, int> m; m["apple"] = 1000; m["banana"] = 2000; cout << m["apple"] << endl; // 1000 cout << m["banana"] << endl; // 2000 return 0; }
3. map의 주요 특징
- key는 중복될 수 없다
map에서 key는 중복될 수 없다. ⇒ 즉, 같은 key에 값을 다시 넣으면 덮어쓰기가 된다.
map<string, int> m; m["apple"] = 1000; m["apple"] = 1500; 이 경우 "apple"이라는 key가 두 번 저장되는 것이 아니라, 기존 값이 수정된다. 결과적으로 map에는 다음 값만 남는다. apple -> 1500 - key 기준으로 자동 정렬된다.
map은 기본적으로 key를 기준으로 오름차순 정렬된다.
map<string, int> m; m["banana"] = 2000; m["apple"] = 1000; m["orange"] = 3000; // 출력시 apple banana orange //예시 코드 #include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, int> m; m["banana"] = 2000; m["apple"] = 1000; m["orange"] = 3000; for(auto item : m) { cout << item.first << " " << item.second << endl; // .first, .second => 바로 뒤 6번에서 다룸 } return 0; } //출력 결과는 다음과 같다. apple 1000 banana 2000 orange 3000
4. map 반복문 사용법
- first와 second 사용법
map은 반복문으로 전체 데이터를 확인할 수 있다.
for(auto item : m) { cout << item.first << " " << item.second << endl; }
여기서 중요한 문법은 다음과 같다.문법 의미 item.first key item.second value
예시
map<string, int> m; m["kim"] = 90; m["lee"] = 80; m["park"] = 70; for(auto item : m) { cout << item.first << " : " << item.second << endl; } //출력결과 kim : 90 lee : 80 park : 70
5. map에서 key 존재 여부 확인하기
- find 함수 사용법
find()는 map 안에 특정 key가 있는지 확인할 때 사용한다.
만약 key가 존재하면 해당 위치를 반환하고, 존재하지 않으면 m.end()를 반환한다.m.find(key)
=> 그래서 보통 아래와 같이 사용한다.
if(m.find("apple") != m.end()) { cout << "존재함"; } else { cout << "존재하지 않음"; } - find를 사용하는 이유
map에서 단순히 다음처럼 접근할 수도 있다.
m["apple"]
하지만 주의할 점이 있다. 존재하지 않는 key를 []로 접근하면, map에 새로운 값이 자동으로 추가된다.
그래서 단순 조회 목적이라면 find()를 사용하는 것이 안전하다.map<string, int> m; cout << m["apple"]; //apple이라는 key를 저장한 적이 없는데도, map에는 자동으로 다음 값이 추가된다. apple -> 0
예를 들어 다음 코드를 보자.
#include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, int> m; m["apple"] = 1000; m["banana"] = 2000; if(m.find("apple") != m.end()) { cout << "apple은 존재합니다." << endl; cout << m["apple"] << endl; } if(m.find("orange") == m.end()) { cout << "orange는 존재하지 않습니다." << endl; } return 0; } // 출력결과 apple은 존재합니다. 1000 orange는 존재하지 않습니다. - count 함수 사용법
count()도 특정 key가 존재하는지 확인할 때 사용할 수 있다.
map은 key가 중복되지 않기 때문에 결과는 항상 0 또는 1이다.m.count(key)결과 의미 0 key가 없음 1 key가 있음
예시( find()보다 간단하게 존재 여부만 확인하고 싶을 때 사용하기 좋다. )
if(m.count("apple")) { cout << "apple 존재"; } - find와 count 차이
find()와 count()는 둘 다 key 존재 여부를 확인할 수 있다.단순히 존재 여부만 확인할 때는 count()가 간단하다.함수 특징 find() key가 있으면 해당 위치를 반환 count() key가 있으면 1, 없으면 0 반환
(참고) [프로그래머스/C++] 추억 점수 (Lv.1)
(참고)[프로그래머스/C++] 가장 가까운 같은 글자 (Lv.1)
6. map 데이터 관리 함수
- size 함수로 데이터 개수 확인하기
map에 저장된 데이터 개수는 size()로 확인한다.
예시
map<string, int> m; m["apple"] = 1000; m["banana"] = 2000; cout << m.size(); // 출력결과: 2 - erase 함수로 데이터 삭제하기
특정 key를 삭제할 때는 erase()를 사용한다.
m.erase("apple"); //예시 map<string, int> m; m["apple"] = 1000; m["banana"] = 2000; m.erase("apple"); // 이후 map에는 "banana"만 남는다. // 전체 데이터를 삭제하고 싶다면 clear()를 사용한다. m.clear();
7. map에서 자주 사용되는 문법 총정리
| 문법 | 의미 |
| map<string, int> m; | string key, int value를 가지는 map 선언 |
| m["apple"] = 1000; | key가 apple인 곳에 1000 저장 |
| m["apple"] | apple key의 value 가져오기 |
| m.find("apple") | apple key가 있는지 탐색 |
| m.find("apple") != m.end() | apple key가 존재함 |
| m.find("apple") == m.end() | apple key가 존재하지 않음 |
| m.count("apple") | apple key 존재 여부 확인 |
| m.erase("apple") | apple key 삭제 |
| m.clear() | map 전체 삭제 |
| m.size() | map 크기 확인 |
8. map과 unordered_map 차이
- C++에는 map과 비슷한 unordered_map도 있다.
알고리즘 문제에서는 단순히 key로 value를 빠르게 찾는 목적이라면구분 map unodered_map 정렬 여부 key 기준 자동 정렬 정렬되지 않음 내부 구조 트리 기반 해시 기반 탐색 속도 O(log N) 평균 O(1) 헤더 <map> <unordered_map> 사용 상황 정렬이 필요할 때 빠른 탐색이 중요할 때
=> unordered_map을 더 많이 사용하기도 한다. 하지만 map은 key가 자동 정렬된다는 장점이 있다.
9. 최종 요약
map은 key와 value를 한 쌍으로 저장하는 C++ STL 자료구조이다.
특정 key를 기준으로 값을 빠르게 찾을 수 있어 이름-점수 매핑, 문자열 등장 횟수 세기, 상품명-가격 저장 같은 문제에서 자주 사용된다.
핵심 문법은 다음과 같다.
map<string, int> m;
m["apple"] = 1000; // 값 저장
cout << m["apple"]; // 값 조회
if(m.find("apple") != m.end()) {
cout << "존재함";
}
if(m.count("apple")) {
cout << "존재함";
}
m.erase("apple"); // 특정 key 삭제
m.clear(); // 전체 삭제
map을 사용할 때 가장 중요한 점은 다음과 같다.
- key는 중복될 수 없다.
- 같은 key에 값을 다시 넣으면 기존 값이 덮어쓰기 된다.
- map은 기본적으로 key 기준 오름차순 정렬된다.
- 존재 여부 확인은 find() 또는 count()를 사용한다.
- 존재하지 않는 key를 [ ]로 접근하면 자동으로 값이 추가될 수 있으므로 주의해야 한다.
- 정렬이 필요 없고 빠른 탐색이 중요하다면 unordered_map도 고려할 수 있다.
결론적으로 map은 특정 값을 기준으로 다른 값을 저장하고 찾아야 하는 문제에서 매우 유용하다.
(참고) [프로그래머스/C++] 가장 가까운 같은 글자 (Lv.1)
(참고) [프로그래머스/C++] 추억 점수 (Lv.1)
'언어 문법정리 > c++' 카테고리의 다른 글
| [C++] insert 함수 정리(set, vector, map) (0) | 2026.05.23 |
|---|---|
| [C++] 정규표현식 regex란? (0) | 2026.05.19 |
| [C++] reverse() 함수 정리 (0) | 2026.05.16 |
| [C++] vector 원하는 구간만 자르기 (0) | 2026.05.16 |
| [C++] 대소문자 변환 방법 정리(함수, ASCII 코드 사용) (0) | 2026.05.11 |
