*연관 컨테이너 ( associate Container )
=> 키 ( Key ) 와 값 ( Value ) 를 묶어서 데이터를 하나의 쌍으로 저장하는 컨테이너
*Map
*왜 Map 이 필요한가 ??
=> vector, list 만으론 데이터를 찾기 부족하다.
( 10만명 유저 접속, 5만명 퇴장되어진 상황 )
ID = 2만 플레이어 가 ID = 1만 플레이어 를 공격하고 싶다.
Q) ID = 1만인 Player 를 찾아라!!
어떻게 ??
=> vector, list 등 선형 자료구조를 이용해선 빠르게 찾을 수 없다. 한땀한땀 찾아야함.
결국, 원하는 조건에 해당하는 데이터를 빠르게 찾을 수 없다.
*균형 이진 트리 ( AVL ) 로 구현되어져 있다.
=> 이진 탐색 트리의 최악의 상황 ( 데이터를 추가했을 때, 트리가 한쪽으로 치우치는 현상 ) 을 고려해
평평하게 트리를 만드는 알고리즘.
srand(static_cast<unsigned int>(time(NULL)));
map<int, int> m;
for (int i = 0; i < 100000; ++i)
{
//pair<int, int> pair = make_pair(i, i + 100);
//m.insert(pair);
m.insert({ i, i + 100 });
}
for (int i = 0; i < 40000; ++i)
{
int randomValue = rand() % 40000;
m.erase(randomValue);
}
map<int, int>::iterator findIt = m.find(10000);
if (findIt != m.end()) cout << "찾음!!" << endl;
else cout << "찾음!!" << endl;
*같은 값을 erase 두 번 하면 어떻게 될까??
unsigned int cnt = 0;
cnt = m.erase(10000); => '1' 반환
cnt = m.erase(10000); => '0' 반환
*중복 허용 X : 같은 키의 값을 두 번 넣지 못함
pair<map<int, int>::iterator, bool > insertIt;
insertIt = m.insert(make_pair(1, 100)); => (1 key, true )
insertIt = m.insert(make_pair(1, 200)); => (1 key, false )
=> 만약, 같은 키값을 넣으려고하면 무시
=> 이미 값이 들어가있어서 바꾸고 싶다고하면 Iterator 를 찾아 해당 값을 바꿔줘야함.
auto findtest = m.find(1);
(*findtest).second = 2;
m[5] = 500;
=> 만약,
'5' Key 값이 없으면 추가
'5' Key 값이 있으면 수정
[ ] 연산자 사용할 때 주의!!
=> 대입을 하지 않더라도 (Key/Value) 형태의 데이터가 추가됨.
m.clear();
for (int i = 0; i < 10; ++i)
{
cout << m[i] << endl;
}
=> int 의 기본값인 '0' 이 계속 추가됨.
*map 순회
for (auto it = m.begin(); it != m.end(); ++it)
{
cout << "key : " << (*it).first << endl;
cout << "value : " << (*it).second << endl;
//cout << "key : " << it->first << endl;
//cout << "value : " << it->second << endl;
}
본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.
'프로그래밍 > C++' 카테고리의 다른 글
#60. Algorithm (0) | 2022.07.21 |
---|---|
#59. set & multimap & multiset (0) | 2022.07.21 |
#57. deque (0) | 2022.07.21 |
#56. list (0) | 2022.07.21 |
#55. vector (0) | 2022.07.21 |