3 분 소요

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
맵이 비어있습니다.


참조

카테고리:

업데이트: