달공이와 임베디드

[C++ 자료구조] unordered_map 본문

알고리즘

[C++ 자료구조] unordered_map

하일리99 2020. 5. 7. 21:46

STL unordered_map ? 

 

이름이 생소할 수도 있겠다. 

 

그냥 hash 자료구조라고 생각하면 된다.

 

hash 자료구조는 언제 쓰는가? 검색이 빨라야할 때 쓴다.

 

특히, 특정 string을 통해 값을 구할 때 key(string) - value(int) 빠르게 찾을 수 있다.

 

계속 강조하지만, 빠른 것이 장점이다. 이름에서부터 느낄 수 있듯 ordered (sorted)를 기대하면 안 된다.

 

여기서 말하는 ordered 는 key의 정렬을 의미한다.

 

sorted +  key(string) - value(int) 구조를 원하면, STL map을 사용하라.

 

참고로 unordered_map은 hash 기반으로 maptree 기반으로 구현되기 때문에

 

unordered_map의 key들은 정렬되어 있지 않고, map의 key들은 정렬되어있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
#include <iostream>
#include <unordered_map>
#include <string>
 
using namespace std;
 
unordered_map<stringint> hs;
 
int main()
{
    hs.insert(make_pair<stringint>("greec"1));
    hs.insert(make_pair<stringint>("luna"3));
    hs.insert(make_pair<stringint>("selly"7));
    hs.insert(make_pair<stringint>("del"5));
    hs.insert(make_pair<stringint>("suprem"4));
    hs.insert(make_pair<stringint>("nord"3));
    hs.insert(make_pair<stringint>("ding"2));
    hs.insert(make_pair<stringint>("creek"2));
    hs.insert(make_pair<stringint>("sua"3));
 
    // element access with key
    cout << "element access" << endl;
    cout << hs["greec"<< endl;
    cout << hs["ding"<< endl;
    cout << hs["sua"<< endl;
    cout << hs["eeqq"<< endl;
    cout << endl;
 
    // add value with the same key
    cout << "insert with the same key" << endl;
    hs.insert(make_pair<stringint>("greec"10));
    cout << hs["greec"<< endl;    // 1
    cout << endl;
    
    // update key with new value
    cout << "insert with the same key" << endl;
    auto iter = hs.find("greec");
    if (iter != hs.end())
    {
        hs.erase("greec");
    }
    hs.insert(make_pair<stringint>("greec"10));
    cout << hs["greec"<< endl;    // 10
    cout << endl;
 
 
    // not ordered
    cout << "iterator in map" << endl;
    for(auto i=hs.begin(); i!=hs.end(); i++)
    {
        cout << i->first << ", " << i->second << endl
    }
    
    /*
※ key 들이 정렬되어 있지 않다.

    creek, 2                                                                                                                                       
    del, 5                                                                                                                                         
    ding, 2                                                                                                                                        
    eeqq, 0                                                                                                                                        
    greec, 1                                                                                                                                       
    luna, 3                                                                                                                                        
    nord, 3                                                                                                                                        
    selly, 7                                                                                                                                       
    sua, 3                                                                                                                                         
    suprem, 4
    */
    
}
cs

'알고리즘' 카테고리의 다른 글

[백준][1065] 한수  (0) 2020.05.09
[C++ 자료구조] STL deque 사용 예제  (0) 2020.05.09
[C++ 자료구조] STL deque  (0) 2020.05.07
[자료구조] 인접 행렬 그래프 (DFS-Recursion)  (0) 2020.01.28
[DP] 1로 만들기  (0) 2018.09.18
Comments