삽입 순서로 저장되는 Map : Map
순서 없는 Map : Unordered Map
#include <map>
#include <unordered_map>
...
map <int, string> m; // 키가 int형, val이 string 형
unordered_map<string, int> map;
Map은 Pair을 삽입하여 first가 Key, Second가 Value가 된다. 따라서 make_pair, 혹은 중괄호로{}
묶어 삽입해줄 수 있다.
m.insert({1, "value"});
주의할 점은 이미 키가 존재하는 경우에는 insert 했을 때 반영이 안된다. 즉 값이 바뀌지 않는다.
map<int,int> m;
m[1]++;
m[1] = 3;
map<string,string> m;
m["없는값"]+="무언가합치기";
위와 같이 바로 값을 변경할 수 있다.
insert과 다르게 이미 있는 키의 경우에도 적용되고,
값이 없는 경우에는 python의 defaultdict처럼 default값으로 새로 만들어진다.
int의 경우는 0, string의 경우는 "".
map.erase(key);
map.count(key); // map은 하나의 값만 들어가므로 0 혹은 1 반환
map.find(key);
cout << map.find(key)->first; //해당 키의 키 값(즉, 그냥 그 키값)
cout << map.find(key)->second; // 해당 키의 val값
cout << (*map.find(key)).first << "\n";
find 함수를 쓰면 iterator를 반환해준다. iterator는 주소값이므로 해당 주소값의 키값, 혹은 value값은 ->
연산자를 써서 가져온다.
혹은 포인터 연산자로 값을 가져올 수도 있다.
find는 존재하지 않는 키를 가져오면 map.end()를 가져온다. 이 map.end()를 통해 map 전체를 순회할 수 있다
cout << (m.find("dfgdfgdfg") == m.end()); // 1
순회 역시 iterator을 통해 할 수 있다.
for (auto iter = map.begin(); iter != map.end(); iter++) {
answer *= ((iter)->second + 1);
}
vector에 map안의 값들을 넣어 정렬한다.
vector를 초기화 할 때 원하는 값의 포인터의 첫번째주소, 마지막주소+1을 넣어서 첫번째~마지막 주소의 값들로 초기화할 수 있다.
static bool comp(pair<char, int>& a, pair<char, int>& b){
return a.second < b.second;
}
map<char, int> m;
vector<pair<char, int>> v(m.begin(), m.end());
sort(v.begin(), v.end(), comp);