프로그래밍/MFC

MFC 맵 클래스

에어버스 2016. 5. 14. 14:57

MFC 맵 클래스

맵은 데이터를 저장할때 키를 이용하여 저장 위치를 결정하는 자료구조
일반적으로 해시테이블 이란 용어를 사용

템플릿클래스

#include <afxtempl.h> 필요

CMap  사용자정의 자료형, CMap(CString, CString&, CPoint, CPoint&) map;

비템플릿 클래스

자주 쓰이는 자료형을 바로 쓸 수 있게 클래스 제공

#include <afxcoll.h> 필요

클래스이름            자료형(키 -> 데이터)            사용예

CMapWordToOb     WORD -> CObject포인터    CMapWordToOb map;
CMapWordToPtr     WORD -> void포인터
CMapPtrToWord     void포인터 -> WORD
CMapPtrToPtr        void포인터 -> void포인터
CMapStringToOb    문자열 -> CObject포인터
CMapStringToPtr    문자열 -> void포인터
CMapStringToString    문자열 -> 문자열

템플릿 맵 클래스

비템플릿 클레스에서 제공하지 않는 자료형인 경우 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <afxtempl.h>
 
template <> UINT AFXAPI HashKey(CString& str)
{ // 기존 제공되는 HashKey() 와 유사
    LPCTSTR key = (LPCTSTR)str;
    UINT nHash = 0;
    while(*key)
        nHash = (nHash << 5+ nHash + *key++;
    return nHash;
}
 
CMap<CString, CString&, UINT, UINT&> map;
map[CString("사과")] = 10;
map[CString("딸기")] = 25;
map[CString("포도")] = 40;
map[CString("수박")] = 15;
 
UINT nCount;
if (map.Lookup(CString("수박"), nCount))
    cout << "수박" << nCount << "상자가 남았습니다." << endl;
cs

UINT AFXAPI HashKey(WORD key)
UINT AFXAPI HashKey(void* key)
UINT AFXAPI HashKey(LPCTSTR key)

MFC는 위 3가지 해시함수를 기본 제공하나 WORD, void*, LPCTSTR 아닌경우 위 소스와 같이 직접 HashKey()를 만들어줘야 한다. 그렇지 않으면 컴파일되지 않는다.

http://petra.tistory.com/877 (참고)

기본제공되는 HashKey() 참고 (큰 차이 없음)

1
2
3
4
5
6
7
UINT AFXAPI CMapStringToString::HashKey(LPCTSTR key)
{
    UINT nHash = 0;
    while (*key)
        nHash = (nHash << 5+ nHash + *key;
    return nHas
}
cs