#include <iostream>
#include <map>
#include <unordered_map>
using namespace std;
int main() {
map<int, int> m;
m.insert({ 1, 100 });
//생성자
m.emplace(2, 200);
m.emplace(4, 400);
m.emplace(3, 200);
m.insert({ 3, 400 }); //첫번째 들어온 key가 존재하면, 두번째 value는 무시가 된다.
m.emplace(5, 200);
for (auto t : m) {
printf("(%d, %d)", t.first, t.second);
}puts(" ");
m[2] = 1000; //key값 지정해주고 value를 넣게 되면 update된다.
//key 존재 -> update 형태, key 존재 x -> insert 형태
int tmp = m[2];
printf("존재하는 key값 저장한 변수 : %d\n", tmp);
tmp = m[1000];
printf("존재하지 않는 key값 저장한 변수 : %d\n", tmp);
//실제 값 읽을 때, key 던졌을 때 존재하지 않으면 기본 자료형 값으로 만들어서 던져줌.
if (m.find(200) != m.end()) { //find : map(O(log N)) vs unordered_map( O(1))
tmp = m[200];
}
int key = 2;
m.erase(key);
for (auto t : m) {
printf("(%d, %d)", t.first, t.second);
}puts(" ");
//set에서 erase에 iterator 주면, find가 존재하지 않으면 end() 반환해서 오류나는데
//set에서 erase에 값을 주면, 오류 안나고 아무일도 안남.
//map에서도 key "값"을 주면, 오류 안나고 아무일도 안나.ㅁ
//key값 중복 불허
//내부구조: hash
//map: (key ,value) => pair (key값은 중복 불허)
//key -> set, 키를 기반으로 오름차순 정렬, find -> O(logN)
//unordered_map : 순수 hash (pro 시험에서 자주 사용)
//key => unordered_set, find -> O(1)
//비정렬 상태 유지
}