지나공 : 지식을 나누는 공간

hash_map | unordered_map | map 차이 비교, 특징 정리 - C++ 본문

Algorithm/C++ 노트

hash_map | unordered_map | map 차이 비교, 특징 정리 - C++

해리리_ 2020. 7. 7. 22:35

hash_와 unordered_에 대하여

 

hash라는 말이 붙지 않은 map,set은 자료를 정렬해서 저장합니다. (key를 기준으로 오름차순 정렬)

따라서 순회할 때도 저장된 데이터를 넣은 순서대로가 아닌 자동정렬된 순서대로 순회합니다.

 

hash_map과 unordered_map은 유사한 컨테이너인데 차이를 말하자면 hash_map은 비표준(namespace가 stdext)이고 unordered_map은 표준(namespace가 std)입니다. 

성능도 unordered_map이 더 우월하고 표준이므로 unordered_map 사용을 권장합니다.

 

 

이제, 출력결과를 통해 비교해볼게요.

출력하면서 생각했던 의문들을 같이 적어봤습니다. 엉뚱하고 너무 당연한 의문이 많아서 민망하지만........

 

 

map

 

중복을 허용하지 않고, key를 기준으로 오름차순 자동정렬됩니다.

 

의문 1. key가 같으면 value를 기준으로 정렬될까?

-> 중복허용을 안하므로 key가 같을 리가 없다...

(이 의문은 multimap 출력을 통해 해결합니다! 아래에 나와요.)

 

의문 2. 중복이 안되니까 이미 존재하는 key를 넣을 때는 새로 들어온 value로 갱신하려나?

-> 라고 생각했는데 이것도 아닙니다. 그냥 처음에 들어간 key가 있고 그 key랑 같은 값이 들어오면 insert가 안됩니다.

 

이는 아래에 첨부한 출력결과로 확인할 수 있습니다.

(3,1)을 넣은 뒤 (3,4),(3,2)를 넣었지만 출력은 map안에는 최초에 넣은 (3,1)만 존재합니다.

중복을 허용하지 않으므로 이후에 넣은 key가 3인 pair들은 insert가 되지 않았습니다.

 

map

 

multimap

 

중복을 허용하고, key를 기준으로 오름차순 자동정렬됩니다.

 

의문 1. key가 같으면 value를 기준으로 정렬될까?

-> 아래 출력 결과에서 key가 3인 경우를 살펴보면, key를 기준으로 오름차순 정렬되는 건 맞지만 같은 key를 가진 value들은 넣은 순서대로 정렬됩니다.

 

multimap

unordered_map

 

중복을 허용하지 않고, 정렬 없이 저장합니다. 해시테이블 저장과 똑같아요. 해시니까.

물론 여기서도 이미 존재하는 key가 들어올 때 새 value로 갱신되는 게 아니라 당연히 insert 자체가 안됩니다.

 

unordered_map

hash_map

 

unordered_map과 거의 유사하지만 성능이 더 안 좋아서 unordered_map사용을 권장합니다.

unordered_map은 표준인 데 반해(namespace가 std) hash_map은 비표준입니다. (stdext)

비주얼 스튜디오에서 사용했더니 실행이 안되면서 unordered_map을 사용하라고 권장하네요.

 

hash_map

 

참고)

map 순회는 vector나 array랑 다르게 index가 아닌 iterator를 사용한다.

 

unordered_map<int,int>m;
for(auto i = m.begin(); i!=m.end();i++){
	cout<< i->fisrt << " " << i->second << endl;
}

 

 

map은 insert없이 m[i] = "값" 으로만 적어도 없는 지 확인하고 없으면 삽입함

728x90
Comments