// cmd.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include <atlcoll.h> // 예제 Book 클래스 class CBook { public: CBook(int i) : mId(i) {} inline int GetId() { return mId; } private: int mId; }; int _tmain(int argc, _TCHAR* argv[]) { /* 선언 */ CAtlMap<DWORD, CBook*> mBookList; /* 입력 첫번째 방법 */ CBook* book1 = new CBook(1); mBookList.SetAt( 1, book1 ); /* 입력 두번째 방법 */ CBook* book2 = new CBook(2); mBookList[2] = book2; /* 검색 */ // [검색 첫번째 방법] // 함수 원형 // bool Lookup( KINARGTYPE key, VOUTARGTYPE value ) const; // key를 주면 value에 돌려주며, 결과값을 bool로 가진다. false일 경우 value는 NULL이다 CBook* book3 = NULL; bool bFind = mBookList.Lookup(1, book3); if( bFind ) { cout << book3->GetId() << endl; } // [검색 두번쨰 방법] // 함수 원형 // const CPair* Lookup( KINARGTYPE key ) const throw( ); // key를 가지고 CPair*형으로 리턴한다 // CPair 는 아래와 같이 POSITION을 상속받음 // class CPair : public __POSITION CAtlMap<DWORD, CBook*>::CPair* pair = mBookList.Lookup(1); if( pair != NULL ) { cout << pair->m_key << endl; cout << pair->m_value->GetId() << endl; } /* 위치 */ // 맵의 시작 위치 POSITION Pos = mBookList.GetStartPosition(); // 다음 위치 CAtlMap<DWORD, CBook*>::CPair* pair2 = mBookList.GetNext(Pos); // CPair 반환 CBook* book = mBookList.GetNextValue(Pos); // Value 반환 // 전체 검색 응용 // 맵의 처음부터 시작하여 모든 데이터를 검색 조회한다 POSITION Pos2 = mBookList.GetStartPosition(); while( Pos2 != NULL ) { // 해당 포지션의 키 얻기 DWORD key = mBookList.GetKeyAt(Pos); // 해당 포지션의 값 얻기 CBook* book2 = mBookList.GetValueAt(Pos); // 다음 포지션의 키 얻기 DWORD NextKey = mBookList.GetNextKey(Pos); // 다음 포지션의 값 얻기 CBook* NextBook = mBookList.GetNextValue(Pos); // 순차적으로 값 얻기 CBook* book = mBookList.GetNextValue(Pos2); cout << book->GetId() << endl; // 해당 포지션의 데이터 CPair로 반환하고 포지션은 다음값을 가짐 (아래 GetAt과 반드시 구별해서 이해가 필요) CAtlMap<DWORD, CBook*>::CPair* pair3 = mBookList.GetNext(Pos2); if( pair != NULL ) { cout << pair->m_key << endl; cout << pair->m_value->GetId() << endl; } // 해당 포지션의 데이터를 CPair로 반환하고 현재 포지션을 가짐 CAtlMap<DWORD, CBook*>::CPair* pair4 = mBookList.GetAt(Pos); if( pair != NULL ) { cout << pair->m_key << endl; cout << pair->m_value->GetId() << endl; } } /* 삭제 */ // 키를 통한 삭제 bool bResult = mBookList.RemoveKey(1); // 검색 포지션을 통한 삭제 mBookList.RemoveAtPos(Pos); // 모두 삭제 mBookList.RemoveAll(); /* 기타 */ // 갯수 얻기 DWORD size = mBookList.GetCount(); // 비어 있는지 확인 bool bEmpty = mBookList.IsEmpty(); // 해시테이블 초기화 (사이즈를 미리 잡고 맵을 만들면 성능상의 이점이 있다) mBookList.InitHashTable(2500); // 위 해시 테이블 초기화와 함께 사용되며, 자동으로 리해싱한다 // 보통 Disable후 Enable를 지정한다( map 데이터가 삭제 되었을 경우 리해싱 ) mBookList.DisableAutoRehash(); // 자동 해시 해제 mBookList.RemoveAll(); // 모두 삭제 된다면 맵데이터 공간 재배열을 위해 리해싱한다 mBookList.EnableAutoRehash(); // 자동 해시 설정 // 수동 리해싱 (bins 값을 넣어서 수동으로 지정한다, 0일 경우 기본값을 가짐) mBookList.Rehash(); delete book1; delete book2; return 0; } |