Thinking Different




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// 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;
}


'프로그래밍 언어 > C++' 카테고리의 다른 글

c++ 문자열 공백 제거 매크로  (0) 2013.03.03
CAtlList 사용법 및 정리  (0) 2013.02.28
2차원배열을 1차원배열처럼  (0) 2013.01.20
VARIANT STRUCTURE  (0) 2012.05.19
윈도우 스레드풀을 이용합시다  (0) 2012.04.11