014 CMap
/* 目录: 一 账号管理 二 CMap 三 AFX CMap参考源码 四 仿写CMap分析 */
一 账号管理
压缩包: 链接
二 CMap 
压缩包: 链接
三 AFX CMap参考源码
// AFX CMap参考源码 template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE> AFX_INLINE void CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::SetAt(ARG_KEY key, ARG_VALUE newValue) { (*this)[key] = newValue; } template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE> VALUE& CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::operator[](ARG_KEY key) { ASSERT_VALID(this); UINT nHashBucket, nHashValue; CAssoc* pAssoc; if ((pAssoc = GetAssocAt(key, nHashBucket, nHashValue)) == NULL) { if (m_pHashTable == NULL) InitHashTable(m_nHashTableSize); ENSURE(m_pHashTable); // it doesn't exist, add a new Association pAssoc = NewAssoc(key); pAssoc->nHashValue = nHashValue; //'pAssoc->value' is a constructed object, nothing more // put into hash table pAssoc->pNext = m_pHashTable[nHashBucket]; m_pHashTable[nHashBucket] = pAssoc; } return pAssoc->value; // return new reference } template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE> 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 } template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE> void CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::RemoveAll() { ASSERT_VALID(this); if (m_pHashTable != NULL) { // destroy elements (values and keys) for (UINT nHash = 0; nHash < m_nHashTableSize; nHash++) { CAssoc* pAssoc; for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) { pAssoc->CAssoc::~CAssoc(); } } // free hash table delete[] m_pHashTable; m_pHashTable = NULL; } m_nCount = 0; m_pFreeList = NULL; m_pBlocks->FreeDataChain(); m_pBlocks = NULL; }
四 仿写CMap分析
// 添加数据和删除数据结构
VALUE& CMap::operator[](KEY key) { int nIndex = key % m_nCount; SNode **pNode = &m_pHash[nIndex]; while (NULL != *pNode) { if (key == (*pNode)->key) { return (*pNode)->value; } pNode = &((*pNode)->pNext); } SNode *pNewNode = new SNode; pNewNode->key = key; pNewNode->pNext = NULL; (*pNode) = pNewNode; return pNewNode->value; } bool CMap::RemoveKey(KEY key) { int nIndex = key % m_nCount; //if (NULL == m_pHash[nIndex]) //{ // return false; //} SNode **pNode = &m_pHash[nIndex]; while (NULL != *pNode) { // *pNode = (SNode*)0x1122; if (key == (*pNode)->key) { break; } pNode = &(*pNode)->pNext; } if (NULL == *pNode) { return false; } SNode *pDel = *pNode; *pNode = (*pNode)->pNext; // pNode = &(*pNode)->pNext; delete[]pDel; return true; }
CMap:: // 分析一 struct SNode { KEY key; VALUE value; SNode *pNext; }; SNode **m_pHash; // 栈内指针数组; SNode : 节点结构 SNode* : 节点指针 - 指向堆中 SNode** : 指针数组 - 保存堆中节点地址。 // 分析二 SNode **pNode = &m_pHash[nIndex]; pNode : 类型: 二级指针; 数据: 地址 - 一级指针; *pNode 类型: 一级指针; 数据: 地址 - 结构体地址; **pNode 类型: 结构体 数据: // *pNode 在数据操作过程中有两种用处 1 当前节点的结构体成员pNext 2 下个节点的结构体指针 数据结构 1 创建数据存储结构 2 为了方便对数据结构操作,或提高算法或优化流程, 在操作的过程中设置变量(一级指针/二级指针/返回值引用)或结构(结构体) 删除: 方法一: 多变量删除 方法二: 二级指针删除
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号