map은 각 노드가 key와 value 쌍으로 이루어진 트리이다 특히, 중복을 허용하지 않는다.
1. 접근 - O(log n)
map은 key값으로 데이터를 저장하기 때문에, key값을 알고 있다면 O(log n)의 시간복잡도로 해당 데이터에 접근할 수 있다.
2. 검색 - O(log n)
map에서 데이터를 검색하는 경우, 이진 탐색 알고리즘을 사용하기 때문에 O(log n)의 시간복잡도를 갖는다.
3. 삽입 및 삭제 - O(log n)
map에서 데이터를 삽입하거나 삭제하는 경우, 데이터를 정렬하여 저장하기 때문에 정렬을 유지하기 위한 추가적인 작업이 필요하다. 따라서, 삽입 및 삭제 연산의 시간복잡도는 O(log n)이다.
#include <map>
//맵 선언
map <key_type, value_type> 이름;
map <string, int> m;
map<key_type, value_type> my_map = {
{key1, value1},
{key2, value2},
{key3, value3},
...
}; // initializer list를 사용하여 초기화하는 방법
map<key_type, value_type> my_map;
my_map.insert(make_pair(key1, value1));
my_map.insert(make_pair(key2, value2));
my_map.insert(make_pair(key3, value3));
// insert() 함수를 사용하여 초기화하는 방법
map<key_type, value_type> old_map;
//...
map<key_type, value_type> new_map(old_map);
// copy constructor를 사용하여 초기화하는 방법
map에서 데이터를 찾을 때는 iterator을 사용한다.
데이터를 끝까지 찾지 못했을 경우, iterator는 map.end()를 반환한다.
if (m.find("a") != m.end()) {
cout << "find" << endl;
}
else {
cout << "not find" << endl;
}
map은 종복을 허용하지 않는데, insert를 수행할 때 key가 중복되면 insert가 수행되지 않는다.
m.insert({"bob", 100});
//인덱스기반
for (auto iter = m.begin() ; iter != m.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
cout << endl;
for (auto iter : m) {
cout << iter.first << " " << iter.second << endl;
}
map에서 데이터를 삭제하기 위해 활용할 함수는 erase와 clear이다.
m.erase(m.begin() + 2);
m.erase("bob");
m.erase(m.begin(), m.end());
m.clear();
Iterators
- begin() : 첫 번째 원소를 가리키는 반복자를 리턴한다.
- cbegin() : 첫 번째 원소를 가리키는 상수 반복자를 리턴한다.
- end() : 마지막 원소를 가리키는 반복자를 리턴한다.
- cend() : 마지막 원소를 가리키는 상수 반복자를 리턴한다.
- rbegin() : 역 순차열의 첫 번째 원소를 가리키는 반복자를 리턴한다.
- crbegin() : 역 순차열의 첫 번째 원소를 가리키는 상수 반복자를 리턴한다.
- rend() : 역 순차열의 마지막 원소를 가리키는 반복자를 리턴한다.
- crend() : 역 순차열의 마지막 원소를 가리키는 상수 반복자를 리턴한다.
- upper_bound(key) : map에서 해당 key 이상인 첫번째 원소를 가리키는 iterator를 반환하는 함수
- lower_bound(key) : map에서 해당 key보다 큰 첫번째 원소를 가리키는 iterator를 반환하는 함수
- equal_range() : map에서 해당 key와 일치하는 범위의 시작과 끝을 가리키는 pair<iterator, iterator>를 반환하는 함수
Element access- at(key) : map에서 해당 key에 대응하는 value를 반환하는 함수. operator[]와 달리, 해당 key가 존재하지 않을 경우 예외를 발생시킨다.
- operator[key] : map에서 해당 key에 대응하는 value를 반환하는 함수
Capacity- empty() : map이 비어있는지 확인하는 함수
- size() : 원소의 개수를 리턴한다.
- max_size() : 담을 수 있는 원소의 최대 개수를 리턴한다.
Modifiers- insert() : map에 새로운 원소를 삽입하는 함수
- erase(key) : map에서 해당 key를 가지는 원소를 제거하는 함수
- erase(iterator pos) : pos위치의 원소 제거
- erase(iterator first, iterator last) : first부터 last까지 제거
- clear() : map의 모든 원소를 제거하는 함수
- count() : map에서 해당 key를 가지는 원소의 개수를 반환하는 함수. map에서는 중복된 key를 가질 수 없으므로, 해당 key를 가지는 원소가 존재하면 1을 반환하며, 존재하지 않으면 0을 반환한다.
- find(key) : map에서 해당 key를 가지는 원소를 탐색하는 함수. 해당 key를 가진 원소가 없을 경우 end()를 반환한다.
- emplace() : map에 새로운 원소를 삽입하는 함수. 기존의 insert() 함수보다 조금 더 빠르며, 새로운 데이터를 생성하는 데 필요한 인수를 직접 전달할 수 있다는 장점이 있다.