2009년 1월 12일 월요일

[Visual C++]CMap 사용 방법

CMap< 'KEY, ARG_KEY, VALUE, ARG_VALUE > m_map;

KEY: Map에 key로 사용될 Object class
ARG_KEY: key참조값으로 사용
VALUE: 저장할 값
ARG_VALUE: value의 참조값으로 사용


CMap이란?
Template collection class 중 하나로서, MFC의 일부로 제공되는 클래스입니다. 일종의 Hash table을 만듭니다.

CMap의 장점은 data를 다루기 위한 다양한 기능의 함수가 존재한다는 것과 Key값으로 data를 handling하기 때문에 순서가 상관없는 경우 CMap이 조회 속도가 빠릅니다. 그리고 내부적으로 알아서 hash table을 만들어주며 이는 매번 달라집니다.(특징)

CMap을 사용해서 변수를 만들 때 4가지의 type을 지정해줘야 하는데
첫번째는 CMap 내부에서 key를 관리할 때 사용하는 data type이고
두번째는 code에서 CMap에게 key를 전달할 때 어떤 type으로 전달하는지 입니다.
세번째는 CMap 내부에서 값을 관리할 때 사용하는 data type이고
마지막 네번째는 code에서 CMap에게 값을 전달할 때 어떤 type으로 전달하는지 입니다.

즉, CMap< 'int, int, CString, CString > m_map;
이처럼 CMap이 만들어졌다면
이 map에게 key를 줄 때는 int형(두번째)으로 줄 것이고,
map 안에서는 key를 int형으로 관리하게 됩니다.
그리고 code에서 값을 줄 때 CString형(네번째)으로 줄 것이고,
이 값을 받아서 map 안에서는 CString형을 관리하게 됩니다.

또 다른 예..
CMap
< 'CString, LPCSTR, CPerson, CPerson& > myMap2;
// Key는 CString, Key Data type은 CStrng& (LPCSTR)
// Data는 CPerson, Data - Data type은 CPerson& (보통 2,4번째
// Type 인자는 각각 1,3번째의 reference형입니다.

[출처] CMap 사용예|작성자 러프



map에 값을 넣을 때: SetAt() / 배열처럼 [] 연산자 사용
map에서 값을 찾을 때: Lookup() 사용
m_map.Lookup(m_nMap, szOut);
map에서 1개의 key와 그 key에 해당하는 값을 삭제할 때: RemoveKey() 사용
map에 저장된 모든 key와 그 key들에 해당하는 값을 삭제할 때: RemoveAll() 사용
map에 저장된 key-값의 쌍의 갯수를 알고 싶을 때: GetCount() 사용
map이 비여 있는지 Check할 때: IsEmpty() 사용
map에 저장된 값중 첫 key의 위치를 얻고 싶을 때: GetStartPosition() 사용
map에 저장된 값중 임의의 위치로부터 순차적으로 값을 읽고 싶을 때: GetNextAssoc() 사용
m_map.GetNextAssoc(pos, nMapMode, szMapMode);



CMap 사용 예제
#include "stdafx.h"
#include <afxtempl.h>

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nValue = 0;
CString strKey;
POSITION pos = NULL;
CMap<CString, LPCSTR, int, int> m;

/* 1. add key and value */
m.SetAt("AAA", 111);
m.SetAt("ABC", 123);

/* 2. lookup key 'AAA' */
if ( m.Lookup("AAA", nValue) )
printf("find 'AAA' = %d\n", nValue);
else
printf("no such key\n");

/* 3. replace key and value */
m.SetAt("AAA", 333);

if ( m.Lookup("AAA", nValue) )
printf("find 'AAA' = %d\n", nValue);
else
printf("no such key\n");

/* 4. iterate map */
pos = m.GetStartPosition();

while ( pos != NULL )
{
m.GetNextAssoc(pos, strKey, nValue);
printf("%s = %d\n", strKey.operator LPCTSTR(), nValue);
}

/* 5. remove 'AAA' key */
m.RemoveKey("AAA");

/* 6. iterate map after removing 'AAA' key */
pos = m.GetStartPosition();

while ( pos != NULL )
{
m.GetNextAssoc(pos, strKey, nValue);
printf("%s = %d\n", strKey.operator LPCTSTR(), nValue);
}

/* 7. print map count */
printf("a saved number of key in map is %d\n", m.GetCount());

/* 8. remove all existing key pair */
m.RemoveAll();
printf("a saved number of key in map is %d\n", m.GetCount());

return 0;
}

CMap 사용 예제 출처 - Software information provider


1 개의 댓글: