CMap key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.
CMap<class Key, class ARG_KEY, class Value, class ARG_VALUE> variable; 과 같이 선언 하여 씁니다.
ARG_KEY, ARG_VALUE 는 이전에 CArray 강의 내용에서 알려드린 내용과 동일합니다. 이전 강의 참조 하시면 됩니다.
https://ansur.blogspot.com/2019/11/mfc-carray.html
간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.
CMap<CString, LPCTSTR, int, int&> mapAlphaASCII; //값 할당. for (int i = 65; i <= 90; i++) { CString sKey; sKey.Format(_T("%c"), i); mapAlphaASCII.SetAt(sKey, i); } //값 출력.. POSITION pos = mapAlphaASCII.GetStartPosition(); CString sKey; int nValue; while (pos) { mapAlphaASCII.GetNextAssoc(pos, sKey, nValue); TRACE(_T("key[%s] value[%d]\n"), sKey, nValue); }
코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다. Key가 CString 이기 때문에 저장된 초기 위치를 얻어와서 다음 멤버가 있을떄까지 루프를 돌면서 멤버를 출력합니다.
초기 CMap 선언시에 두번쨰 ARG_KEY 타입을 CString 이 아닌 LPCTSTR 로 선언을 하였습니다.
이유는 키의 참조형 변수 인데 이건 내부적으로 키값을 접근할때 객체를 직접 접근 할수 있는 일반 타입으로 선언이 되어야 합니다.
CMap 관련 상세한 인터페이스는 https://docs.microsoft.com/en-us/cpp/mfc/reference/cmap-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(AFXTEMPL%2FCMap);k(CMap);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019 여기서 확인 하실수 있습니다.
제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
a. SetAt : CMap 에 멤버를 추가 해주는 메소드 입니다.
b. GetCount/GetSize : CMap 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. RemoveAll : CMap 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. RemoveKey : CMap 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. GetStartPosition : POSITION 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.
f. GetNextAssoc : POSITION 를 이용하는 방식을 이용할때 현재 위치에서 다음 지시하는 멤버를 리턴합니다.
g. Lookup : 특정 키에 해당하는 값을 리턴합니다.
위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.
CMap<CString, LPCTSTR, int, int&> mapAlphaASCII; //값 할당. for (int i = 65; i <= 90; i++) { CString sKey; sKey.Format(_T("%c"), i); mapAlphaASCII.SetAt(sKey, i); } TRACE(_T("mapAlphaASCII Member Count %d\n"), mapAlphaASCII.GetCount()); //POSITION 값 출력.. POSITION pos = mapAlphaASCII.GetStartPosition(); CString sKey; int nValue; while (pos) { mapAlphaASCII.GetNextAssoc(pos, sKey, nValue); TRACE(_T("key[%s] value[%d]\n"), sKey, nValue); } // B 값을 찾아 삭제. int nFindValue; if (mapAlphaASCII.Lookup(_T("B"), nFindValue)) { if (mapAlphaASCII.RemoveKey(_T("B"))) TRACE(_T("\"B\" is Deleted.\n")); else TRACE(_T("\"B\" is Not Deleted.\n")); } else TRACE(_T("Not Found B\n")); TRACE(_T("mapAlphaASCII Member Count %d\n"), mapAlphaASCII.GetSize()); //전체 멤버 삭제. mapAlphaASCII.RemoveAll(); TRACE(_T("mapAlphaASCII Member Count: %d\n"), mapAlphaASCII.GetCount());
댓글 없음:
댓글 쓰기