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 为了方便对数据结构操作,或提高算法或优化流程,
        在操作的过程中设置变量(一级指针/二级指针/返回值引用)或结构(结构体)

删除: 
  方法一: 多变量删除
  方法二: 二级指针删除

 

posted @ 2019-11-19 04:43  火焰马  阅读(268)  评论(0)    收藏  举报