首页 > 其他 > 详细

CMap类封装

时间:2020-03-21 17:19:27      阅读:52      评论:0      收藏:0      [点我收藏+]
#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, ‘\0‘, 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;
}

  

CMap类封装

原文:https://www.cnblogs.com/veis/p/12540074.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!