分享方式:


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 將專案插入對應中;如果找到相符的索引鍵,則會取代現有的專案。

公用運算子

名稱 描述
CMap::operator [ ] 將專案插入對應中 , 運算子取代 SetAt

備註

將索引鍵/值組 (element) 插入對應之後,您就可以使用索引鍵有效地擷取或刪除配對來存取它。 您也可以逐一查看地圖中的所有元素。

類型的 POSITION 變數可用來替代存取專案。 您可以使用 POSITION 來「記住」專案,並逐一查看地圖。 您可能會認為此反復專案是依索引鍵值循序的;不是。 擷取的專案序列不確定。

這個類別的某些成員函式會呼叫全域協助程式函式,這些函式必須針對類別的大部分 CMap 用途進行自訂。 請參閱 MFC 參考 的宏和全域一節 中的集合類別協助程式

CMapCObject::Serialize覆寫以支援其元素的序列化和傾印。 如果使用 將地圖儲存至封存 Serialize ,則會接著序列化每個對應專案。 協助程式函式的預設實作 SerializeElements 會進行位寫入。 如需衍生自 CObject 或其他使用者定義型別之指標集合專案序列化的相關資訊,請參閱 如何:建立類型保管庫集合

如果您需要對應中個別專案的診斷傾印(索引鍵和值),您必須將傾印內容的深度設定為 1 或更大。

CMap刪除物件時,或移除其專案時,會移除索引鍵和值。

對應類別衍生類似于清單衍生。 如需特殊用途清單類別衍生的圖例,請參閱 Collections 一文

繼承階層架構

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::PLookupCMap::PGetFirstAssocCMap::PGetNextAssoc 的傳回值。

範例

如需使用方式的範例,請參閱 的 CMap::PLookup 範例。

CMap::GetCount

擷取對應中的專案數目。

INT_PTR GetCount() const;

傳回值

項目的數目。

範例

請參閱 的 CMap::Lookup 範例。

CMap::GetHashTableSize

決定對應之雜湊表中的專案數目。

UINT GetHashTableSize() const;

傳回值

雜湊表中的專案數目。

範例

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

UINT uTableSize = myMap.GetHashTableSize();

CMap::GetNextAssoc

擷取位於 rNextPosition 的 map 元素,然後更新 rNextPosition 以參考對應中的下一個專案。

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

參數

rNextPosition
指定先前 GetNextAssocGetStartPosition 呼叫所傳回值的參考 POSITION

KEY
指定對應索引鍵類型的樣板參數。

rKey
指定所擷取專案的傳回索引鍵。

VALUE
指定地圖數值型別的樣板參數。

rValue
指定擷取之專案的傳回值。

備註

此函式最適合逐一查看對應中的所有元素。 請注意,位置序列不一定與索引鍵值序列相同。

如果擷取的專案是對應中的最後一個,則 的新值 rNextPosition 會設定為 NULL

範例

請參閱 的 CMap::SetAt 範例。

CMap::GetSize

傳回對應專案的數目。

INT_PTR GetSize() const;

傳回值

地圖中的專案數目。

備註

呼叫此方法以擷取地圖中的專案數目。

範例

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;

傳回值

POSITION值,表示用於反覆運算地圖的起始位置;如果 NULL 地圖是空的,則為 。

備註

反復專案序列無法預測;因此,「地圖中的第一個專案」沒有特殊意義。

範例

請參閱 的 CMap::SetAt 範例。

CMap::InitHashTable

初始化雜湊表。

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

參數

hashSize
雜湊表中的專案數。

bAllocNow
如果 TRUE 為 ,則會在初始化時配置雜湊表,否則會視需要配置資料表。

備註

為了獲得最佳效能,雜湊表大小應該是質數。 若要將衝突降到最低,大小應該比預期的資料集大約 20%。

範例

請參閱 的 CMap::Lookup 範例。

CMap::IsEmpty

判斷地圖是否為空白。

BOOL IsEmpty() const;

傳回值

如果此對應不包含任何元素,則為非零;否則為 0。

範例

請參閱 的 CMap::RemoveAll 範例。

CMap::Lookup

查閱對應至指定索引鍵的值。

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

參數

ARG_KEY
指定數值型別的 key 樣板參數。

key
指定要查閱之專案的索引鍵。

VALUE
指定要查閱之值的型別。

rValue
接收查閱的值。

傳回值

如果找到專案,則為非零;否則為 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

傳回 map 物件的第一個專案。

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

傳回值

對應中第一個專案的指標;請參閱 CMap::CPair 。 如果對應未包含任何專案,則值為 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.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

擷取 所指向的 pAssocRec 對應專案。

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

CPair *PGetNextAssoc(const CPair* pAssocRet);

參數

pAssocRet
指向上 PGetNextAssoc 一個或 CMap::PGetFirstAssoc 呼叫傳回的對應專案。

傳回值

對應中下一個專案的指標;請參閱 CMap::CPair 。 如果元素是對應中的最後一個元素,則值為 NULL

備註

呼叫此方法以逐一查看地圖中的所有專案。 擷取第一個具有 呼叫 PGetFirstAssoc 的專案,然後使用對 的後續呼叫 PGetNextAssoc 逐一查看對應。

範例

請參閱 的 CMap::PGetFirstAssoc 範例。

CMap::PLookup

尋找對應至指定索引鍵的值。

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

參數

key
要搜尋之專案的索引鍵。

傳回值

索引鍵結構的指標;請參閱 CMap::CPair 。 如果找不到相符專案, CMap::PLookup 則傳 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[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
要移除之專案的索引鍵。

傳回值

如果找到並成功移除專案,則為非零;否則為 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
階層架構圖表