프로그래밍/C++

#58. Map

코딩하는상후니 2022. 7. 21. 22:03

 

*연관 컨테이너 ( 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