Download presentation
Presentation is loading. Please wait.
1
About CAltMap 최흥배
2
생성자 파라메터 CAtlMap( UINT nBins = 17, float fOptimalLoad = 0.75f,
float fLoThreshold = 0.25f, float fHiThreshold = 2.25f, UINT nBlockSize = 10 ) throw ( ); 파라메터 nBins 저장 되어 있는 요소로의 포인트를 가진 bin 수. fOptimalLoad 최적의 읽기 비율 fLoThreshold 읽기 비율의 최저한의 수 fHiThreshold 읽기 비율의 최대한의 수 nBlockSize 블록 크기
3
CAtlMap은 해시 알고리즘을 사용합니다.
이 인덱스는 들어있는 성분에 대한 포인터를 포함하는 "빈"을 참조합니다. 빈이 사용중인 경우는 연결 리스트를 만들어 다음 요소에 접근합니다. 요소로 이동합니다. 리스트 조사는 목적 요소에 직접 접근하여 비교하면 느리므로 맵 구조체에서는 성능과 공간 조건의 밸런스를 고려해야 합니다. 대부분 기존 파라메터를 선택하면 최적의 결과를 얻을 수 있습니다. 읽기 비율이라는 것은 맵 오브젝트에 들어가 있는 요소 수에 대한 “빈”수의 비율입니다. 파라메터 fOptimalLoad 값은 맵 구조체의 재 계산을 행할 때 필요한 빈 수를 계산할 때에 사용 됩니다. 이 값은 CAtlMap::SetOptimalLoad 메소드를 사용하여 변경 가능합니다. 파라메터 fLoThreshold는 읽기 비율의 최소 값으로 CAtlMap이 맵의 최적의 크기를 재 계산할 때까지 유효합니다. 파라메터 fHiThreshold는 읽기 비율의 최대 값으로 CAtlMap이 맵의 최적의 크기를 재 계산할 때까지 유효합니다. 이 재 계산 프로세스는 ‘재 해쉬’라고 부르며, 기본으로 유효하게 설정 되어 있습니다. 한번에 대량의 데이터를 입력하는 경우 등에 이 프로세스를 무효로 할 때는 CAtlMap::DisableAutoRehash을 호출합니다. 이 프로세스를 다시 유효하게 하려면 CAtlMap::EnableAutoRehash 메소드를 호출합니다. 파라메터 nBlockSize는 새로운 요소를 요구할 때 할당 되는 메모리 량입니다. 블록 사이즈를 크게하면 메모리 할당 루틴의 호출은 적게 되지만, 사용하는 리소스는 크게 됩니다. 데이터를 넣기 전에 CAtlMap::InitHashTable을 호출하여 해쉬 테이블을 초기화 할 필요가 있습니다.
4
// Confirm the number of elements in the map
ATLASSERT(mySinTable.GetCount()==45); // Walk through all the elements in the map. // First, get start position. POSITION pos; int key; double value; pos = mySinTable.GetStartPosition(); // Now iterate the map, element by element while (pos != NULL) { key = mySinTable.GetKeyAt(pos); value = mySinTable.GetNextValue(pos); } return 0; // Example program for CAtlMap class #include "stdafx.h" #include "atlcoll.h" #include "math.h" int main(int argc, char* argv[]) { // Create a map which stores a double // value using an integer key CAtlMap<int, double> mySinTable; int i; // Initialize the Hash Table mySinTable.InitHashTable(257); // Add items to the map for (i=0; i<90; i++) mySinTable[i]=sin(i); // Confirm the map is valid mySinTable.AssertValid(); // Confirm the number of elements in the map ATLASSERT(mySinTable.GetCount()==90); // Remove elements with even key values for (i=0; i<90; i+=2) mySinTable.RemoveKey(i);
5
InitHashTable 원형 : bool InitHashTable( UINT nBins, bool bAllocNow = true ); 파라메터 nBins 해쉬 테이블이 사용할 ‘빈’ 수. bAllocNow 메모리를 몇 개 할당 할 것인가를 지시하는 플래그 반환 값 초기화가 정상으로 종료한 경우는 true 반환. 그 이외는 false 를 반환한다. InitHashTable 은 해쉬 테이블에 요소를 넣기 전에 호출할 필요가 있다. 이 함수를 명시적으로 호출하지 않은 경우 요소가 처음 추가 될 때에 CAtlMap 생성자에 의해 지정된 ‘빈’ 수를 사용하여 자동적으로 호출된다. 명시적으로 호출한 경우 nBins 파라메터로 지정한 새로운 ‘빈’ 수를 사용하여 맵이 초기화 된다. 파라메터 bAllocNow 을 false 로 하면 처음 요구가 있을 때 해쉬 테이블에 필요한 메모리가 할당 되지는 않습니다. 이것은 맵이 어떻게 사용 되는지 잘 모를 경우에 편리합니다.
6
SetAt 추가 원형 : POSITION SetAt( KINARGTYPE key, VINARGTYPE value ); 파라메터
CAtlMap 오브젝트에 추가하는 키 값 value CAtlMap 오브젝트에 추가하는 값 반환 값 CAtlMap 오브젝트 내에 키와 값 조합시킨 요소의 위치를 반환한다. 일치하는 키가 발견되는 경우 SetAt 은 기존 요소의 값을 변경한다. 키가 발견 되지 않은 경우 새로운 키와 값 조합이 만들어진다.
7
void main() { CAtlMap< int, GameItem > AtlMapTest; GameItem tGameItem1(1,1000); AtlMapTest.SetAt( 1, tGameItem1 ); GameItem tGameItem2(2,344); AtlMapTest.SetAt( 2, tGameItem2 ); GameItem tGameItem3(3,2000); AtlMapTest.SetAt( 3, tGameItem3 ); CAtlMap< int, GameItem >::CPair* pair = NULL; POSITION pos = AtlMapTest.GetStartPosition(); while (pos) pair = AtlMapTest.GetNext(pos); cout << "Key(" << pair->m_key << ") Value(" << pair->m_value._BuyMoney << ")" << endl; } #include <iostream> #include <windows.h> #include <atlcoll.h> using namespace std; // CAtlMap에서 사용하는 경우 기본 생성자 이외의 생성자를 // 정의하면 무조건 기본 생성자를 정의해야 CAtlMap에서 // 사용할 수 있다. struct GameItem { GameItem() { } GameItem( int ItemCd, int BuyMoney ) _ItemCd = ItemCd; _BuyMoney = BuyMoney; } int _ItemCd; int _BuyMoney; };
8
RemoveKey 키로 삭제 원형 : bool RemoveKey( KINARGTYPE key ) throw( ); 파라메터
삭제할 요소의 조합에 대응하는 키 반환 값 키가 발견되어 삭제된 경우는 true를 반환. 그 이외의 경우는 false를 반환.
9
RemoveAtPos 위치 카운터로 삭제 원형 : void RemoveAtPos( POSITION pos ) throw( );
파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환된 위치 카운터. 해설 지정된 위치케 저장 되어 있는 키와 값 조합을 삭제한다. 요소를 저장하기 위해 사용되고 있던 메모리는 해제한다. pos 가 참조하고 있는 POSITION 는 무효로 됩니다만 맵 내의 그 외 요소의 POSITION 은 유효합니다. 이것에 의해 요소의 승순이 갱신되어도 별 문제는 없습니다.
10
RemoveAll 모두 삭제 원형 : void RemoveAll() throw( ); 해설
CAtlMap 오브젝트를 clear하여 요소를 저장하기 위해 사용한 메모리를 해방한다.
11
Lookup 검색 원형 : bool Lookup( KINARGTYPE key, VOUTARGTYPE value ) const; const CPair* Lookup( KINARGTYPE key ) const throw( ); CPair* Lookup( KINARGTYPE key ) throw( ); 파라메터 key 검색하는 요소를 식별할 키. value 검색된 값을 받을 변수. 반환 값 첫 번째 형식은 키가 발견 된 경우 true를 반환. 그 이외의 경우는 false를 반환. 두 번째와 세 번째 형식에서는 CPair 의 포인터를 반환합니다. 이 포인터는 CAtlMap::GetNext 등의 호출 위치로서 사용할 수 있습니다. Lookup 은 해시 알고리즘을 사용하여 지정한 파라메터의 키와 완전하게 일치하는 키를 가진 맵 요소를 빠르게 검색합니다.
12
예) CAtlMap< int, GameItem > AtlMapTest; …….. CAtlMap< int, GameItem >::CPair* pFindValue = AtlMapTest.Lookup(2); // 값 변경도 가능 pFindValue->m_value._BuyMoney = 400;
13
SetValueAt 값 변경 원형 : void SetValueAt( POSITION pos, VINARGTYPE value ); 파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환된 위치. value CAtlMap 오브젝트에 추가하는 값. CAtlMap 오브젝트 내의 지정한 위치에 저장되어 있는 값을 변경한다.
14
GetStartPosition 맵의 시작 위치
원형 : POSITION GetStartPosition( ) const throw( ); 반환 값 시작 위치를 반환한다. 맵이 비어 있다면 NULL 을 반환한다 해설 POSITION 값을 반환하여 맵의 반복처리를 시작한다. POSITION 값을 GetNextAssoc 메소드에 넘기는 것도 가능하다.
15
GetNext 다음 위치 원형 : CPair* GetNext( POSITION& pos ) throw( ); const CPair* GetNext( POSITION& pos ) const throw( ); 파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환된 위치 카운터. 반환 값 맵에 저장되어 있는 다음 키와 값 조합 요소의 포인터를 반환한다. 위치 카운더 pos는 호출 후에 매회 갱신된다. 맵 내의 마지막 요소를 얻으면 pos에는 NULL 이 설정된다.
16
순회 예제 CAtlMap< int, GameItem > AtlMapTest; …….
CAtlMap< int, GameItem >::CPair* pair = NULL; POSITION pos = AtlMapTest.GetStartPosition(); while (pos) { pair = AtlMapTest.GetNext(pos); cout << "Key(" << pair->m_key << ") Value(" << pair->m_value._BuyMoney << ")" << endl; }
17
GetCount 맵의 총 개수 원형 : size_t GetCount( ) const throw( ); 반환 값
맵 오브젝트의 요소 수를 반환한다. 하나의 요소는 키와 값의 조합으로 되어 있다.
18
IsEmpty 맵이 있었는가? 원형 : bool IsEmpty( ) const throw( ); 반환 값
맵이 빈 경우는 true 를 반환합니다. 그 이외의 경우는 false 을 반환합니다.
19
GetKeyAt 지정된 위치에 있는 키를 획득
원형 : const K& GetKeyAt( POSITION pos ) const throw( ); 파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환 된 위치 카운터. 반환 값 CAtlMap 오브젝트 내의 지정된 위치에 저장되어 있는 키의 참조를 반환한다.
20
GetNextKey 다음 위치에 있는 키를 획득
원형 : const K& GetNextKey( POSITION& pos ) const throw( ); 파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환 된 위치 카운터. 반환 값 맵 내의 다음 키의 참조를 반환한다. 해설 현재의 위치 카운터 pos 를 갱신합니다. 맵 내에 다음 엔트리가 존재하지 않는 경우 위치 카운터에는 NULL 이 설정됩니다.
21
GetValueAt 지정된 위치에 있는 값을 획득
원형 : V& GetValueAt( POSITION pos ) throw( ); const V& GetValueAt( POSITION pos ) const throw( ); 파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환된 위치 카운터. 반환 값 CAtlMap 오브젝트 내 지정된 위치에 저장되어 있는 값의 참조를 반환한다.
22
GetNextValue 다음 위치에 있는 값을 획득
원형 : V& GetNextValue( POSITION& pos ) throw( ); const V& GetNextValue( POSITION& pos ) const throw( ); 파라메터 pos CAtlMap::GetNextAssoc 또는 CAtlMap::GetStartPosition 로의 이전 호출에서 반환된 위치 카운터. 반환 값 맵 내의 다음 위치의 값의 참조를 반환. 해설 현재 위치 카운터 pos를 갱신한다. 맵 내에 다음 엔트리가 존재하지 않는 경우 위치 카운터에는 NULL이 설정된다.
23
Rehash 재 해쉬한다. 원형 : void Rehash( UINT nBins = 0 ); 파라메터 nBins
해쉬 테이블에서 사용하는 빈의 수. 해설 nBins 가 0 인 경우 CAtlMap 은 맵 내의 요소 수와 최적의 읽기 설정 값을 토대로 적절한 수치를 계산합니다. 통상 재 해쉬 프로세스는 자동 처리 됩니다만 CAtlMap::DisableAutoRehash 가 호출 되는 경우는 이 메소드가 사이즈 변경 처리를 필요에 응합니다.
24
SetOptimalLoad 읽기 최적화 설정
원형 : void SetOptimalLoad( float fOptimalLoad, float fLoThreshold, float fHiThreshold, bool bRehashNow = false ); 파라메터 fOptimalLoad 최적의 읽기 비율 fLoThreshold 읽기 비율의 최소한의 값 fHiThreshold 읽기 비율의 최대한의 값. bRehashNow 해쉬 테이블의 재 계산이 필요할지 말지를 표시하는 플래그 해설 이 메소드는 CAtlMap 오브젝트의 최적의 읽기 비율을 재 정의한다. 각 파라메터의 설명은에 대해서는 「CAtlMap::CAtlMap」을 참고. bRehashNow 의 반환 값이 true 이고, 또한 요소 수가 최소 값보다도 작은 경우랑 최대 값 보다 큰 경우는 해쉬 테이블이 재 계산된다.
25
DisableAutoRehash 자동 재 해쉬를 무효로
원형 : void DisableAutoRehash( ) throw( ); 해설 자동 재 해쉬가 유효로 되어 있는 경우 (기본 설정) 읽기 비율 (배열에 저장되어 있는 요소 수에 대한 빈 수의 비율)이 맵 작성 시에 설정된 최소 값 보다도 작게 되던가 최대 값 보다도 크게 되거나 하면 해쉬 테이블의 빈 수는 자동적으로 재 계산된다. DisableAutoRehash 는 한번에 대량의 요소를 맵에 추가할 때에 사용하면 가장 좋다.제한을 넘을 때마다 재 해쉬 프로세스를 발생 시키는 것보다도 DisableAutoRehash 를 호출하여 요소를 추가한 후에 CAtlMap::EnableAutoRehash 를 호출하는 쪽이 효율적이다.
26
EnableAutoRehash 자동 재 해쉬를 유효로
원형 : void EnableAutoRehash( ) throw( ); 해설 자동 재 해쉬가 유효한 경우(기본 설정) 읽기 비율(배열에 저장되어 있는 요소 수에 대한 빈 수의 비율)이 맵 작성 시에 설정된 최소 값보다도 작던가, 최대 값보다도 크게 되면 해 쉬 테이블의 빈 수가 자동적으로 재 계산된다. EnableAutoRefresh 는 대부분의 경우 CAtlMap::DisableAutoRehash 의 호출 후에 사용된다.
Similar presentations