BOOL CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::RemoveKey(ARG_KEY key)
// remove key - return TRUE if removed
{
ASSERT_VALID(this);
if (m_pHashTable == NULL)
return FALSE; // nothing in the table
UINT nHashValue;
CAssoc** ppAssocPrev;
nHashValue = HashKey<ARG_KEY>(key);
ppAssocPrev = &m_pHashTable[nHashValue%m_nHashTableSize];
CAssoc* pAssoc;
for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext)
{
if ((pAssoc->nHashValue == nHashValue) && CompareElements(&pAssoc->key, &key))
{
// remove it
*ppAssocPrev = pAssoc->pNext; // remove from list
FreeAssoc(pAssoc);
return TRUE;
}
ppAssocPrev = &pAssoc->pNext;
}
return FALSE; // not found
}
*ppAssocPrev = pAssoc->pNext; // remove from list
FreeAssoc(pAssoc);
传统手段会申请一个临时变量 , CAssoc* temp 来存放pAssoc变化前的值。
这里用二级指针,看起来高大上,但感觉也没多大效果,了解一下就行