다음을 통해 공유


CMap 수업

고유 키를 값에 매핑하는 사전 컬렉션 클래스입니다.

구문

template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>class CMap : public CObject

매개 변수

KEY
맵의 키로 사용되는 개체의 클래스입니다.

ARG_KEY
인수에 KEY 사용되는 데이터 형식입니다. 일반적으로 에 대한 참조입니다 KEY.

VALUE
맵에 저장된 개체의 클래스입니다.

ARG_VALUE
인수에 VALUE 사용되는 데이터 형식입니다. 일반적으로 에 대한 참조입니다 VALUE.

멤버

공용 구조체

속성 설명
CMap::CPair 키 값과 연결된 개체의 값을 포함하는 중첩된 구조체입니다.

공용 생성자

속성 설명
CMap::CMap 키를 값에 매핑하는 컬렉션을 생성합니다.

공용 메서드

이름 설명
CMap::GetCount 이 맵의 요소 수를 반환합니다.
CMap::GetHashTableSize 해시 테이블의 요소 수를 반환합니다.
CMap::GetNextAssoc 반복할 다음 요소를 가져옵니다.
CMap::GetSize 이 맵의 요소 수를 반환합니다.
CMap::GetStartPosition 첫 번째 요소의 위치를 반환합니다.
CMap::InitHashTable 해시 테이블을 초기화하고 해당 크기를 지정합니다.
CMap::IsEmpty 빈 맵 조건(요소 없음)에 대한 테스트입니다.
CMap::Lookup 지정된 키에 매핑된 값을 조회합니다.
CMap::PGetFirstAssoc 첫 번째 요소에 대한 포인터를 반환합니다.
CMap::PGetNextAssoc 반복할 다음 요소에 대한 포인터를 가져옵니다.
CMap::PLookup 값이 지정된 값과 일치하는 키에 대한 포인터를 반환합니다.
CMap::RemoveAll 이 맵에서 모든 요소를 제거합니다.
CMap::RemoveKey 키로 지정된 요소를 제거합니다.
CMap::SetAt 맵에 요소를 삽입합니다. 는 일치하는 키가 있으면 기존 요소를 대체합니다.

Public 연산자

속성 설명
CMap::operator [ ] 맵에 요소를 삽입합니다. 연산자 대체는 SetAt다음과 같습니다.

설명

맵에 키-값 쌍(요소)을 삽입한 후에는 키를 사용하여 쌍을 효율적으로 검색하거나 삭제하여 액세스할 수 있습니다. 지도의 모든 요소를 반복할 수도 있습니다.

형식 POSITION 변수는 항목에 대한 대체 액세스에 사용됩니다. 항목을 POSITION "기억"하고 지도를 반복하는 데 사용할 수 있습니다. 이 반복은 키 값별로 순차적이라고 생각할 수 있습니다. 그것이 아니야. 검색된 요소의 시퀀스는 확정되지 않습니다.

이 클래스의 특정 멤버 함수는 대부분의 클래스 사용에 맞게 사용자 지정해야 하는 전역 도우미 함수를 CMap 호출합니다. MFC 참조의 매크로 및 전역 섹션에서 컬렉션 클래스 도우미참조하세요.

CMap 해당 요소의 CObject::Serialize serialization 및 덤프를 지원하도록 재정의합니다. 맵을 사용하여 Serialize보관에 저장하면 각 지도 요소가 차례로 serialize됩니다. 도우미 함수의 SerializeElements 기본 구현은 비트 쓰기를 수행합니다. 파생된 CObject 포인터 컬렉션 항목 또는 다른 사용자 정의 형식의 serialization에 대한 자세한 내용은 방법: 형식 안전 컬렉션 만들기를 참조하세요.

맵에 있는 개별 요소(키 및 값)의 진단 덤프가 필요한 경우 덤프 컨텍스트의 깊이를 1 이상으로 설정해야 합니다.

개체가 CMap 삭제되거나 요소가 제거되면 키와 값이 모두 제거됩니다.

지도 클래스 파생은 목록 파생과 유사합니다. 특수 용도 목록 클래스의 파생에 대한 일러스트레이션은 컬렉션 문서를 참조하세요.

상속 계층 구조

CObject

CMap

요구 사항

머리글: afxtempl.h

CMap::CMap

빈 맵을 생성합니다.

CMap(INT_PTR nBlockSize = 10);

매개 변수

nBlockSize
맵을 확장하기 위한 메모리 할당 세분성을 지정합니다.

설명

맵이 커짐에 따라 메모리가 항목 단위 nBlockSize 로 할당됩니다.

예시

// declares a map of ints to points
CMap<int, int, CPoint, CPoint> myMap(16);

CMap::CPair

키 값과 연결된 개체의 값을 포함합니다.

설명

클래스 내의 중첩된 구조체 CMap입니다.

구조체는 다음 두 개의 필드로 구성됩니다.

  • key 키 형식의 실제 값입니다.

  • value 연결된 개체의 값입니다.

이 값은 , CMap::PGetFirstAssocCMap::PGetNextAssoc.의 CMap::PLookup반환 값을 저장하는 데 사용됩니다.

예시

사용 예제는 .에 대한 CMap::PLookup예제를 참조하세요.

CMap::GetCount

맵의 요소 수를 검색합니다.

INT_PTR GetCount() const;

Return Value

요소의 수입니다.

예시

CMap::Lookup에 대한 예를 참조하세요.

CMap::GetHashTableSize

맵에 대한 해시 테이블의 요소 수를 결정합니다.

UINT GetHashTableSize() const;

Return Value

해시 테이블의 요소 수입니다.

예시

CMap<int, int, CPoint, CPoint> myMap;

UINT uTableSize = myMap.GetHashTableSize();

CMap::GetNextAssoc

맵 요소를 검색 rNextPosition한 다음 맵의 다음 요소를 참조하도록 업데이트합니다 rNextPosition .

void GetNextAssoc(
    POSITION& rNextPosition,
    KEY& rKey,
    VALUE& rValue) const;

매개 변수

rNextPosition
이전 GetNextAssoc 또는 GetStartPosition 호출에서 반환된 POSITION 값에 대한 참조를 지정합니다.

KEY
맵 키의 형식을 지정하는 템플릿 매개 변수입니다.

rKey
검색된 요소의 반환된 키를 지정합니다.

VALUE
맵 값의 형식을 지정하는 템플릿 매개 변수입니다.

rValue
검색된 요소의 반환된 값을 지정합니다.

설명

이 함수는 맵의 모든 요소를 반복하는 데 가장 유용합니다. 위치 시퀀스가 반드시 키 값 시퀀스와 같은 것은 아닙니다.

검색된 요소가 맵의 마지막 요소인 경우 새 값 rNextPosition 이 로 설정 NULL됩니다.

예시

CMap::SetAt에 대한 예를 참조하세요.

CMap::GetSize

지도 요소의 수를 반환합니다.

INT_PTR GetSize() const;

Return Value

맵의 항목 수입니다.

설명

이 메서드를 호출하여 맵의 요소 수를 검색합니다.

예시

CMap<int, int, CPoint, CPoint> myMap;

myMap.InitHashTable(257);

// Add 200 elements to the map.
for (int i = 0; i < 200; i++)
{
   myMap[i] = CPoint(i, i);
}

// Remove the elements with even key values.
CPoint pt;
for (int i = 0; myMap.Lookup(i, pt); i += 2)
{
   myMap.RemoveKey(i);
}

ASSERT(myMap.GetSize() == 100);
TRACE(_T("myMap with %d elements:\n"), myMap.GetCount());
POSITION pos = myMap.GetStartPosition();
int iKey;
CPoint ptVal;
while (pos != NULL)
{
   myMap.GetNextAssoc(pos, iKey, ptVal);
   TRACE(_T("\t[%d] = (%d,%d)\n"), iKey, ptVal.x, ptVal.y);
}

CMap::GetStartPosition

호출에 전달할 수 있는 POSITION 값을 반환하여 맵 반복을 시작합니다 GetNextAssoc .

POSITION GetStartPosition() const;

Return Value

POSITION 맵을 반복하기 위한 시작 위치 또는 NULL 맵이 비어 있는 경우를 나타내는 값입니다.

설명

반복 시퀀스는 예측할 수 없습니다. 따라서 "맵의 첫 번째 요소"는 특별한 의미가 없습니다.

예시

CMap::SetAt에 대한 예를 참조하세요.

CMap::InitHashTable

해시 테이블을 초기화합니다.

void InitHashTable(UINT hashSize, BOOL  bAllocNow = TRUE);

매개 변수

hashSize
해시 테이블의 항목 수입니다.

bAllocNow
이면 TRUE초기화 시 해시 테이블을 할당하고, 그렇지 않으면 필요할 때 테이블이 할당됩니다.

설명

최상의 성능을 위해 해시 테이블 크기는 소수여야 합니다. 충돌을 최소화하려면 크기가 가장 큰 예상 데이터 집합보다 약 20% 커야 합니다.

예시

CMap::Lookup에 대한 예를 참조하세요.

CMap::IsEmpty

맵이 비어 있는지 여부를 확인합니다.

BOOL IsEmpty() const;

Return Value

이 맵에 요소가 없으면 0이 아닙니다. 그렇지 않으면 0입니다.

예시

CMap::RemoveAll에 대한 예를 참조하세요.

CMap::Lookup

지정된 키에 매핑된 값을 조회합니다.

BOOL Lookup(ARG_KEY key, VALUE& rValue) const;

매개 변수

ARG_KEY
값의 형식을 지정하는 템플릿 매개 변수입니다 key .

key
조회할 요소를 식별하는 키를 지정합니다.

VALUE
조회할 값의 형식을 지정합니다.

rValue
조회된 값을 받습니다.

Return Value

요소가 발견된 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

Lookup 는 해시 알고리즘을 사용하여 지정된 키와 정확히 일치하는 키를 사용하여 지도 요소를 빠르게 찾습니다.

예시

CMap<int, int, CPoint, CPoint> myMap;

myMap.InitHashTable(257);

// Add 200 elements to the map.
for (int i = 0; i < 200; i++)
{
   myMap[i] = CPoint(i, i);
}

// Remove the elements with even key values.
CPoint pt;
for (int i = 0; myMap.Lookup(i, pt); i += 2)
{
   myMap.RemoveKey(i);
}

ASSERT(myMap.GetSize() == 100);
TRACE(_T("myMap with %d elements:\n"), myMap.GetCount());
POSITION pos = myMap.GetStartPosition();
int iKey;
CPoint ptVal;
while (pos != NULL)
{
   myMap.GetNextAssoc(pos, iKey, ptVal);
   TRACE(_T("\t[%d] = (%d,%d)\n"), iKey, ptVal.x, ptVal.y);
}

CMap::operator [ ]

멤버 함수를 편리하게 대체합니다 SetAt .

VALUE& operator[](arg_key key);

매개 변수

VALUE
맵 값의 형식을 지정하는 템플릿 매개 변수입니다.

ARG_KEY
키 값의 형식을 지정하는 템플릿 매개 변수입니다.

key
맵에서 값을 검색하는 데 사용되는 키입니다.

설명

따라서 할당 문(l-value)의 왼쪽에서만 사용할 수 있습니다. 지정된 키를 가진 map 요소가 없으면 새 요소가 만들어집니다.

맵에서 키를 찾을 수 없기 때문에 이 연산자에 해당하는 "오른쪽"(r-value)이 없습니다. 요소 검색에 Lookup 멤버 함수를 사용합니다.

예시

CMap::Lookup에 대한 예를 참조하세요.

CMap::PGetFirstAssoc

지도 개체의 첫 번째 항목을 반환합니다.

const CPair* PGetFirstAssoc() const;
CPair* PGetFirstAssoc();

Return Value

지도의 첫 번째 항목에 대한 포인터입니다. 를 참조하세요 CMap::CPair. 맵에 항목이 없으면 값은 .입니다 NULL.

설명

맵 개체의 첫 번째 요소에 대한 포인터를 반환하려면 이 함수를 호출합니다.

예시

typedef CMap<int, int, CPoint, CPoint> CMyMap;
CMyMap myMap;

myMap.InitHashTable(257);

// Add 10 elements to the map.
for (int i = 0; i <= 10; i++)
   myMap.SetAt(i, CPoint(i, i));

// Print the element value with even key values.
int nKey = 0;
CPoint pt;
CMyMap::CPair *pCurVal;

pCurVal = myMap.PGetFirstAssoc();
while (pCurVal != NULL)
{
   if ((nKey % 2) == 0)
   {
      _tprintf_s(_T("Current key value at %d: %d,%d\n"),
                 pCurVal->key, pCurVal->value.x, pCurVal->value.y);
   }
   pCurVal = myMap.PGetNextAssoc(pCurVal);
   nKey++;
}

CMap::PGetNextAssoc

로 가리키는 map 요소를 검색합니다 pAssocRec.

const CPair *PGetNextAssoc(const CPair* pAssocRet) const;

CPair *PGetNextAssoc(const CPair* pAssocRet);

매개 변수

pAssocRet
이전 PGetNextAssoc 또는 CMap::PGetFirstAssoc 호출에서 반환된 지도 항목을 가리킵니다.

Return Value

맵의 다음 항목에 대한 포인터입니다. 를 참조하세요 CMap::CPair. 요소가 맵의 마지막 요소인 경우 값은 .입니다 NULL.

설명

맵의 모든 요소를 반복하려면 이 메서드를 호출합니다. 호출 PGetFirstAssoc 을 사용하여 첫 번째 요소를 검색한 다음 연속 호출을 사용하여 맵을 반복합니다 PGetNextAssoc.

예시

CMap::PGetFirstAssoc에 대한 예를 참조하세요.

CMap::PLookup

지정된 키에 매핑된 값을 찾습니다.

const CPair* PLookup(ARG_KEY key) const;
CPair* PLookup(ARG_KEY key);

매개 변수

key
검색할 요소의 키입니다.

Return Value

키 구조에 대한 포인터입니다. 를 참조하세요 CMap::CPair. 일치하는 항목이 없으면 .를 CMap::PLookup 반환합니다 NULL.

설명

지정된 키와 정확히 일치하는 키가 있는 map 요소를 검색하려면 이 메서드를 호출합니다.

예시

typedef CMap<int, int, CPoint, CPoint> CMyMap;
CMyMap myMap;

myMap.InitHashTable(257);

// Add 10 elements to the map.
for (int i = 0; i <= 10; i++)
   myMap[i] = CPoint(i, i);

// Print the element values with even key values.
CMyMap::CPair *pCurVal;

for (int i = 0; i <= myMap.GetCount(); i += 2)
{
   pCurVal = myMap.PLookup(i);
   _tprintf_s(_T("Current key value at %d: %d,%d\n"),
              pCurVal->key, pCurVal->value.x, pCurVal->value.y);
}

CMap::RemoveAll

전역 도우미 함수 DestructElements를 호출하여 이 맵에서 모든 값을 제거합니다.

void RemoveAll();

설명

맵이 이미 비어 있는 경우 함수가 올바르게 작동합니다.

예시

CMap<int, int, CPoint, CPoint> myMap;

// Add 10 elements to the map.
for (int i = 0; i < 10; i++)
   myMap.SetAt(i, CPoint(i, i));

myMap.RemoveAll();

ASSERT(myMap.IsEmpty());

CMap::RemoveKey

제공된 키에 해당하는 맵 항목을 조회합니다. 키를 찾은 경우 항목을 제거합니다.

BOOL RemoveKey(ARG_KEY key);

매개 변수

ARG_KEY
키의 형식을 지정하는 템플릿 매개 변수입니다.

key
제거할 요소의 키입니다.

Return Value

항목이 발견되고 성공적으로 제거된 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

DestructElements 도우미 함수는 항목을 제거하는 데 사용됩니다.

예시

CMap::SetAt에 대한 예를 참조하세요.

CMap::SetAt

기본은 맵에 요소를 삽입하는 것을 의미합니다.

void SetAt(ARG_KEY key, ARG_VALUE newValue);

매개 변수

ARG_KEY
매개 변수의 형식을 지정하는 템플릿 매개 변수입니다 key .

key
새 요소의 키를 지정합니다.

ARG_VALUE
매개 변수의 형식을 지정하는 템플릿 매개 변수입니다 newValue .

newValue
새 요소의 값을 지정합니다.

설명

첫째, 키를 조회합니다. 키를 찾은 경우 해당 값이 변경됩니다. 그렇지 않으면 새 키-값 쌍이 만들어집니다.

예시

CMap<int, int, CPoint, CPoint> myMap;

// Add 10 elements to the map.
for (int i = 0; i < 10; i++)
   myMap.SetAt(i, CPoint(i, i));

// Remove the elements with even key values.
POSITION pos = myMap.GetStartPosition();
int nKey;
CPoint pt;
while (pos != NULL)
{
   myMap.GetNextAssoc(pos, nKey, pt);

   if ((nKey % 2) == 0)
      myMap.RemoveKey(nKey);
}

// Print the element values.
pos = myMap.GetStartPosition();
while (pos != NULL)
{
   myMap.GetNextAssoc(pos, nKey, pt);
   _tprintf_s(_T("Current key value at %d: %d,%d\n"),
              nKey, pt.x, pt.y);
}

참고 항목

MFC 샘플 COLLECT
CObject 수업
계층 구조 차트