zoukankan      html  css  js  c++  java
  • CMap类封装

    #pragma once
    
    template<typename KEY, typename VALUE, typename ARG_KEY = KEY&, typename ARG_VALUE = VALUE&>
    class CMap
    {
    	struct SNode
    	{
    		KEY key;
    		VALUE value;
    		SNode *pNext;
    	}**m_pHash;
    
    	int m_nCount;
    	int m_nSize;
    	
    public:
    	CMap(int nCount = 17);
    	~CMap();
    	int GetHashTableSize() const
    	{
    		return m_nSize;
    	}
    	int GetSize() const
    	{
    		return m_nCount;
    	}
    	void SetAt(ARG_KEY key, ARG_VALUE newValue);
    	bool LookUp(ARG_KEY key, ARG_VALUE rvalue) const;
    	ARG_VALUE operator[](ARG_KEY key);
    	bool RemoveKey(ARG_KEY key);
    	void RemoveAll();
    
    };
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::CMap(int nCount)
    {
    	m_nSize = 0;
    	m_nCount = nCount;
    	m_pHash = new SNode *[nCount];
    	memset(m_pHash, '', sizeof(SNode *)*nCount);
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::~CMap()
    {
    	RemoveAll();
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    void CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::SetAt(ARG_KEY key, ARG_VALUE newValue)
    {
    	// 调用下标号的两种方法
    	// operator[](key) = newValue;
    	(*this)[key] = newValue;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    bool CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::LookUp(ARG_KEY key, ARG_VALUE rvalue) const
    {
    	int nIndex = key % m_nCount;
    	SNode *p = m_pHash[nIndex];
    	while (p)
    	{
    		if (p->key == key)
    		{
    			rvalue = p->value;
    			return true;
    		}
    		p = p->pNext;
    	}
    	return false;
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    ARG_VALUE CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::operator[](ARG_KEY key)
    {
    	++m_nSize;
    	int nIndex = key % m_nCount;
    	SNode* *p = &m_pHash[nIndex];
    
    	while (*p)
    	{
    		if ((*p)->key == key)
    			return (*p)->value;
    		p = &((*p)->pNext);
    	}
    	SNode *pNew = new SNode;
    	pNew->key = key;
    	pNew->pNext = NULL;
    	*p = pNew;
    	return pNew->value;
    }
    
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    bool CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::RemoveKey(ARG_KEY key)
    {
    	if (m_pHash == NULL)
    		return false;  // nothing in the table
    
    	SNode ** ppPrev = &m_pHash[key % m_nCount];
    
    	SNode* p;
    	for (p = *ppPrev; p != NULL; p = p->pNext)
    	{
    		if (p->key == key)
    		{
    			*ppPrev = p->pNext;
    			delete[]p;
    			return true;
    		}
    		ppPrev = &p->pNext;
    	}
    	return false;  // not found
    }
    
    template<typename KEY, typename VALUE, typename ARG_KEY, typename ARG_VALUE>
    void CMap<KEY, VALUE, ARG_KEY, ARG_VALUE>::RemoveAll()
    {
    	int n = 0;
    	SNode **ppPrev = &m_pHash[n];
    	if (!m_pHash)
    		return;
    	SNode *p;
    	while (n < m_nCount)
    	{
    		while (p = *ppPrev)
    		{
    			*ppPrev = p->pNext;
    			delete[]p;
    		}
    		ppPrev = &m_pHash[++n];
    	}
    	delete[]m_pHash;
    	m_pHash = NULL;
    	m_nCount = 0;
    	m_nSize = 0;
    }
    

      

  • 相关阅读:
    LeetCode 137. Single Number II
    LeetCode 16. 3Sum Closest
    LeetCode 18. 4Sum
    LeetCode 15. 3Sum
    LeetCode 166. Fraction to Recurring Decimal
    LeetCode Anagrams
    Java: Difference between ArrayList and LinkedList
    LeetCode 242. Valid Anagram
    LeetCode 204. Count Primes
    Java Class Variable/Static Variable
  • 原文地址:https://www.cnblogs.com/veis/p/12540074.html
Copyright © 2011-2022 走看看