Balanced tree(균형 트리)로 구현되면, 그중 red-black tree로 구현되어 있다.
중복을 허용하지 않고, key를 기준으로 자동으로 오름차순 정렬된다.
#include <map>
map<string, int> m;
1) m.insert(pair<string, int>("marin", 40));
2) m.insert(make_pair("scv", 60));
3) m["firebat"] = 50;
보통 3번 방식을 많이 쓴다고 한다.
또한 2와 3을 쓰려면 iostream을 include해야 한다고 한다.
그리고... 기존 키에 값이 존재한다면, 이를 그냥 덮어쓴다!
반복 호출 방법에는 여러 가지가 있다.
map<string, int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
{
cout << it->first << ' ' << it->second << '\n';
}
iterator를 활용한 방법! 화살표 연산을 해 줘야 함.
for(pair<string, int> atom : m)
{
cout << atom.first << ' ' << atom.second << '\n';
}
이런 방법도 있고...
for (auto& kv : m)
{
cout << kv.first << ' ' << kv.second << '\n';
}
auto를 쓰는 방법도 있고......
#include <algorithm>
void TempFunction(std::pair<string, int> pair)
{
cout << pair.first << ' ' << pair.second << '\n';
}
for_each(m.begin(), m.end(), TempFunction);
이게 좀 많이 혁명이었지만
TempFunction처럼, map을 매개변수로 받는 함수만 가능한 듯
find 함수를 통한 방법도 있고, 직접 배열처럼 접근 방법도 있다.
cout << m.find("a")->first << ' '
<< m.find("a")->second << '\n';
find의 결과는 iterator다. 따라서 화살표 연산 꼭 필요!
cout << "temp" << ' ' << m["temp"] << '\n';
이것도 두 가지 방법이 있는데
m.erase("a");
보통 이렇게 erase 함수를 이용하여 지우지만
m.erase(m.find("temp"));
가끔 iterator를 사용해야 한다면, 이렇게 지우는 듯.
map과 사용하는 방법이 동일하다.
다만 map은 red-black tree로 구현되어 있고
unordered_map은 해시 테이블로 구현되어 있다
때문에 성능이 보통 좋지만... 데이터가 많으면 많을수록 hash table의 기능은 리드미컬하게 떨어진다고 한다. (비둘기 집의 원리? 해시 충돌 때문인 듯)
결론적으로, 데이터가 작다면 unordered_map이, 크다면 map이 유리하다고 한다.