Map
Map은 Set과 마찬가지로 Binary Tree(이진 트리) 형식으로 이루어진 자료구조로,
key-value 쌍으로 이루어진다. 이때 Key값은 중복을 허용하지 않으며 key값에 따라 정렬된다.
Python의 dictionary와 유사하다고 보면 되는데, key값을 통해 value에 접근할 수 있다.
1. Map 선언
#include <map> // map STL : map, multimap 포함
#include <unordered_map> // unordered_map STL : unordered_map, unordered_multimap 포함
std::map<std::string, int> m1;
map<string, int> m2{
{"Kim", 24},
{"Noh", 25},
{"Park", 21}
};
map을 선언할 때는 pair(key, value)쌍이 원소로 들어가기에 두 개의 데이터타입을 지정하여야 한다.
역시 Template를 지원하기에 다양한 데이터타입을 key, value로 받아올 수 있다.
m2 map처럼 선언과 동시에 원소를 초기화할 수도 있다.
2. 접근, 추가, 삭제
Map은 key값을 통해 value에 접근할 수 있고, container에 새로운 key-value를 추가, 삭제가 가능하다.
접근
std::map<std::string, int> m3{
{"Kim", 23},
{"Lee", 24},
{"Noh", 25}
};
std::cout << m3["Lee"] << std::endl; // 24
std::cout << m3["Noh"] << std::endl; // 25
m3["Noh"] = 20;
std::cout << m3["Noh"] << std::endl; // 20
위 코드에서 m3[“Noh”] = 20;처럼 value값을 변경할 수도 있다.
추가
m3["Park"] = 18; // 1번 방식
m3.insert({"Ko", 29}); // 2번 방식
m3.insert(make_pair("Choi", 22)); // 3번 방식
pair<string, int> p1{"Ho", 17}; // 4번 방식
m3.insert(p1);
2. 2번 방식은 insert 메소드를 사용하여, {key, value}쌍을 추가한다.
3. 3번 방식처럼 make_pair(dataType1, dataType2) 함수로 pair 쌍을 만들어 insert할 수 있다.
4. 4번 방식에서는 따로 pair를 선언하여 map에 insert할 수 있다.
삭제
map역시 iterator가 존재하며 이를 통한 삭제가 가능, 또한 전체 원소를 삭제할 수도 있다.
개별 삭제는 key값을 통해 삭제할 수 있다.
m3.erase("Park"); // key값을 통한 삭제
m3.erase(m3.begin(), m3.end()); // iterator를 이용한 전체 삭제
m3.clear(); // clear 메소드 이용, 전체 삭제
3. iterator
map역시 iterator가 존재하고, 이를 통해 map을 순회할 수 있다.
std::cout << "-------" << std::endl;
for (std::map<std::string, int>::iterator iter = m3.begin(); iter != m3.end(); iter++){
std::cout << iter->first << " " << iter->second << std::endl;
}
std::cout << "-------" << std::endl;
std::cout << "-------" << std::endl;
for (auto iter : m3){
std::cout << iter.first << " " << iter.second << std::endl;
}
std::cout << "-------" << std::endl;
map의 개별 원소의 first에는 key값이 second에는 value값이 들어간다.
4. find
map에서 찾고자 하는 key값이 있는 지 알고 싶을 때, find 메소드를 사용한다.
if (m3.find("Ho") != m3.end()){
std::cout << "find" << std::endl;
}
else{
std::cout << "not find"<< std::endl;
}
find 메소드는 iterator를 사용하기에 end iterator와 비교하여 포함 여부를 판단할 수 있다.
5. methods
map에서 많이 쓰이는 주요 메소드들은 아래와 같다.
m.empty();
m.size();
m.find(key);
m.insert(key, value);
m.erase(key);
m.clear();
6. unordered_map, multimap
- unordered_map : unordered_map은 map과 같지만, 정렬이 되어 있지 않아 순서가 없다.
- multimap : multimap은 map과 달리 중복 key값을 허용한다.
- unordered_multimap : 순서가 없고, key값의 중복을 허용한다.
unordered_map, unordered_multimap은 추가로 헤더가 필요하다.
#include <unordered_map>
#include <map>
.
.
.
map<data type1, data type2> m1; // 중복 불가, 요소 정렬
unordered_map<data type1, data type2> m2; // 중복 불가, 요소 비정렬
miltimap<data type1, data type2> m3; // 중복 가능, 요소 정렬
unordered_multimap<data type1, data type2> m4; // 중복 가능, 요소 비정렬
Map은 STL로 Template를 지원하는 container 자료구조의 일종이다.
key-value 쌍으로 이루어지며, 균형이진트리 구조를 기본으로 한다.