Post

C++ STL로 Double Map 구현 [희망편]

C++ STL로 Double Map 구현 [희망편]

STL

일반적인 Map

일반적인 HashMap의 특정 원소에 Key값으로 접근할 수 있다. 예를 들어 Map이 다음과 같이 정의되어 있다고 가정하자.

1
map<char,int> map

Key,Value 다음과 같다고 가정하자. | | | | — | — | | A | 1 | | B | 6 | | C | 11 | | D | 16 | | E | 21 |

value 11에게 접근하기 위해서는 map['C']라고 사용해야한다. 보통의 배열이 int형 index로 원소값에 접근하지만, Map은 다양한 자료형을 통해 접근이 가능하다. 그러나 2차원 배열처럼 Map을 사용하려면 어떻게 해야 할까? map['C']['B']처럼 접근하여 값을 찾고 싶은 것이다.

Double Map

본론부터 말하자면 다음과 같이 선언하면 Map을 2차원 배열처럼 사용이 가능하다.

1
map<char, map<char, int>> doubleMap;

내가 가정한 2차원 테이블은 다음과 같다.

Table

 ABCDE
A12345
B678910
C1112131415
D1617181920
E2122232425

예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<map>

using namespace std;

int main() {
    map<char, map<char, int>> doubleMap; //init
    int num = 1;
    for (char col_ch = 'A'; col_ch <= 'E'; col_ch++) {
        for (char row_ch = 'A'; row_ch <= 'E'; row_ch++) {
            doubleMap[col_ch][row_ch] = num++;
        }

    }
    for (auto e: doubleMap) { //e = pair<char,map<char,int>>
        for (auto kv: e.second) { // kv = map<char,int>
            cout << "doubleMap['" << e.first << "'] " << "['" << kv.first << "']" << " = " << kv.second << " ";
        }
        cout << "\n";
    }
}

결과

1
2
3
4
5
doubleMap['A'] ['A'] = 1 doubleMap['A'] ['B'] = 2 doubleMap['A'] ['C'] = 3 doubleMap['A'] ['D'] = 4 doubleMap['A'] ['E'] = 5 
doubleMap['B'] ['A'] = 6 doubleMap['B'] ['B'] = 7 doubleMap['B'] ['C'] = 8 doubleMap['B'] ['D'] = 9 doubleMap['B'] ['E'] = 10 
doubleMap['C'] ['A'] = 11 doubleMap['C'] ['B'] = 12 doubleMap['C'] ['C'] = 13 doubleMap['C'] ['D'] = 14 doubleMap['C'] ['E'] = 15 
doubleMap['D'] ['A'] = 16 doubleMap['D'] ['B'] = 17 doubleMap['D'] ['C'] = 18 doubleMap['D'] ['D'] = 19 doubleMap['D'] ['E'] = 20 
doubleMap['E'] ['A'] = 21 doubleMap['E'] ['B'] = 22 doubleMap['E'] ['C'] = 23 doubleMap['E'] ['D'] = 24 doubleMap['E'] ['E'] = 25 

의도했던 바와 같다.

PS를 하다가 일반적인 intindex 접근(2차원 배열, matrix[4][5]와 같은)이 아닌 stringkey 접근이 필요한 순간이 온다. 예를 들어 doubleMap["John"]["James"] = 5 처럼 인물간의 관계를 표현할 때 사용된다. 이런 경우에는 다음과 같이 선언하면 된다.

1
map<string, map<string, int>> doubleMap;

다음번에는 STL을 사용하지 않고 직접 구현을 해봐야겠다.

This post is licensed under CC BY 4.0 by the author.