• 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;
    }
    

      

  • 相关阅读:
    抓取登录后的数据
    Form认证的几点说明
    eclipse启动错误:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer
    mysql游标的使用 No data
    mysql insert 主键 重复问题
    tail 命令
    maven 打包可执行jar的方法
    maven中如何打包源代码
    工程师,请优化你的代码
    在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)
  • 原文地址:https://www.cnblogs.com/veis/p/12540074.html
Copyright © 2020-2023  润新知