개요
C++에서는 맵 자료구조를 갖는 컨테이너로 표준 라이브러리의 map을 사용할 수있습니다.
map<char, int> m;
map은 키와 데이터를 쌍으로 저장 및 관리하는 특징을 가지며, 중복을 허용하는 map으로 std::multimap을, 정렬하지 않는 map으로 std::unordered_map을 사용할 수 있습니다.
특징
- 동적 컨테이너 크기
- 요소를 추가하거나 삭제할 때 컨테이너의 크기가 자동으로 조절됩니다.
- 자동 정렬
- _Pr 템플릿 매개변수를 이용하여 정렬 방식을 선택할 수 있습니다.
- 기본적으로는 less(오름차순) 정렬 객체를 사용하고, greator(내림차순) 정렬 객체를 사용하거나 사용자가 직접 작성할 수도 있습니다.
- 키를 이용한 임의 접근
- map의 요소는 키를 이용하여 해당 요소의 데이터에 접근할 수 있습니다.
- 중복되는 키 값은 사용할 수 없습니다.
- Red-Black Tree 구조
- 내부적으로 Red-Black Tree 구조를 사용하여 요소의 삽입 및 삭제 후 정렬까지 O(log n)의 시간복잡도를 가집니다.
헤더
#include <map>
map을 사용하기 위해서 <map> 헤더를 포함해야 합니다.
선언 및 초기화
템플릿 매개변수
map<_Kty, _Ty, _Pr = less<_Kty>, _Alloc = allocator<pair<const _Kty, _Ty>>>
map은 타입을 선언할 때, 최소 2개, 최대 4개의 템플릿 매개변수를 받습니다.
- _Kty은 키의 사용할 형식을 나타냅니다.
- _Ty은 실제 저장되는 데이터의 형식을 나타냅니다.
- _Pr은 데이터를 정렬할 비교 함수 객체를 나타냅니다. 지정하지 않으면 기본적으로 std::less 객체를 사용합니다.
- _Alloc은 할당자(Allocator)를 나타냅니다. 지정하지 않으면 기본 할당자가 사용됩니다.
생성자
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
// 컨테이너는 { {'A', 1}, {'B', 2}, {'C', 3} }로 초기화됩니다.
map을 선언과 동시에 초기화하기 위해서 중괄호를 이용해 컨테이너의 초기 요소들을 설정할 수 있습니다.
iterator 복사
map<_Kty, _Ty> m(_First, _Last);
다른 컨테이너의 iterator를 이용하여 요소를 복사합니다.
- _First는 복사할 컨테이너의 첫 iterator를 나타냅니다.
- _Last는 복사할 컨테이너의 마지막 iterator를 나타냅니다.
map 복사
map<_Kty, _Ty> m(_Right);
다른 map을 복사하여 새로운 map을 생성합니다.
- _Right는 복사할 map을 나타냅니다.
std::pair
map<char, int> m;
m.insert(pair<char, int>('A', 1));
map의 요소는 pair로 구성되어 있습니다. 따라서 map에 요소를 추가하기 위해서는 pair 객체를 생성 후 삽입해야 합니다.
m.insert(make_pair('A', 1));
간결하고 가독성있는 코드 작성을 위해 make_pair 함수를 사용할 수도 있습니다. make_pair를 사용하면 pair의 템플릿 매개변수를 자동 추론하여 더 간결하게 작성할 수 있습니다.
m.insert({'A', 1});
C++ 17부터는 위와 같이 pair의 초기화 리스트를 사용하여 더 간결하게 표현할 수 있습니다.
주요 함수
size()
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
size_t s = m.size(); // 3을 반환합니다.
map의 현재 크기를 반환합니다.
empty()
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
bool is_empty = m.empty(); // false를 반환합니다.
map이 비어있는지 여부(크기가 0이면 true, 그렇지 않으면 false)를 반환합니다.
count(key)
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
int c = m.count('B'); // 1을 반환합니다.
map에 특정 값(value)이 존재하는지 여부(존재하면 1, 그렇지 않으면 0)를 반환합니다.
- key는 특정 요소의 키 값을 나타냅니다.
at(key)
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
int m1 = m['B']; // 2를 반환합니다.
int m2 = m.at('B'); // 2를 반환합니다.
map의 요소에 키를 이용해 접근하여 값을 반환합니다.
- key는 접근할 요소의 키 값을 나타냅니다.
find(key)
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
auto it = m.find('B'); // 요소 {'B', 2}에 대한 iterator를 반환합니다.
map에서 특정 값을 갖는 요소의 iterator를 반환합니다.
- key는 찾을 요소의 키 값을 나타냅니다.
begin()
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
auto it = m.begin();
map에서 첫 번째 요소의 iterator를 반환합니다.
end()
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
auto it = m.end();
map에서 마지막 요소의 iterator를 반환합니다.
insert(pair)
map<char, int> m { {'A', 1}, {'C', 3} };
m.insert({'B', 2}); // 컨테이너는 { {'A', 1}, {'B', 2}, {'C', 3} } 상태입니다.
map에 요소를 삽입합니다.
이미 존재하는 키 값을 사용하는 경우 해당 삽입은 무시됩니다.
- pair는 삽입할 요소(키, 데이터)를 나타냅니다.
erase(key)
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
m.erase('B'); // 컨테이너는 { {'A', 1}, {'C', 3} } 상태입니다.
map에서 특정 키를 갖는 요소를 삭제합니다.
- key는 삭제할 요소의 키 값을 나타냅니다.
erase(first, last)
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
m.erase(m.begin(), m.end()); // 컨테이너는 { } 상태입니다.
map의 특정 요소 범위의 값을 삭제합니다.
- first는 삭제할 범위의 첫 iterator를 나타냅니다.
- last는 삭제할 범위의 마지막 iterator를 나타냅니다.
clear()
map<char, int> m { {'A', 1}, {'B', 2}, {'C', 3} };
m.clear(); // 컨테이너는 { } 상태입니다.
map의 모든 요소를 삭제합니다.
swap(map)
map<char, int> m1 { {'A', 1}, {'B', 2}, {'C', 3} };
map<char, int> m2 { {'a', 11}, {'b', 22}, {'c', 33} };
m1.swap(m2);
// m1 컨테이너는 { {'a', 11}, {'b', 22}, {'c', 33} } 상태입니다.
// m2 컨테이너는 { {'A', 1}, {'B', 2}, {'C', 3} } 상태입니다.
map의 모든 요소를 교환합니다.