哈希树

/* CLASS_BEGIN *****************************************************
   类名:THashMap
   功能:哈希树
   实现:Snight Q:51171107
   CLASS_END  ******************************************************/

#ifndef H_HASHMAP_H
#define H_HASHMAP_H
#include "BinaryMap.h"

 template <class Key, class Value>
 class THashMap
 {
 public:
	 THashMap(unsigned long aulBarrelsSize = 100) 
		 : m_ulBarrelsSize(aulBarrelsSize) {}
 	
	 ~THashMap(void)
	{clean();}
 
 	BOOL insert(Key aoKey, Value& aoValue)
 	{
		Value* lpTemp = NULL;
		int liPos = 0;
		int liBarrelsNo = Hash(aoKey);
		m_oBarrels.Find(liBarrelsNo,  lpTemp,  liPos);
		if(!lpTemp)
		{
			lpTemp = new Value[m_ulBarrelsSize];
			memset(lpTemp, 0 , sizeof(Value)*m_ulBarrelsSize);
			m_oBarrels.Insert(liBarrelsNo, lpTemp);
		}
			
		if (lpTemp)
		{
			lpTemp[aoKey%m_ulBarrelsSize] = aoValue;
			return TRUE;
		}
		return FALSE;
 	}

	BOOL erase(Key aoKey)
	{
		Value* lpTemp = NULL;
		int liPos = 0;

		m_oBarrels.Find(Hash(aoKey),  lpTemp,  liPos);
		if(!lpTemp)
			return FALSE;

		lpTemp[aoKey%m_ulBarrelsSize] = 0;
		return FALSE;
	}

	BOOL find(Key aoKey, Value& aoValue)
	{
		Value* lpTemp = NULL;
		int liPos = 0;

		m_oBarrels.Find(Hash(aoKey),  lpTemp,  liPos);
		if(!lpTemp)
			return FALSE;

		aoValue = lpTemp[aoKey%m_ulBarrelsSize];
		return TRUE;
	}

 private: 
 	unsigned long Hash(Key aoKey)
 	{
 		if (!aoKey)  return 0;

		return aoKey/m_ulBarrelsSize;
 	}
	void clean(void)
	{
		for(int i = 0; i< m_oBarrels.Size(); ++i)
		{
			delete [] m_oBarrels[i];
			m_oBarrels[i] = 0;
		}
	}
 private:
	TBinaryMap<unsigned long, Value*>		m_oBarrels;
	unsigned long							m_ulBarrelsSize;
};

#endif//H_HASHMAP_H


//暂时不提供特化版本

// 配合空间内另一片二叉树 使用

ps: 很纳闷 相比较 微软的 map 和hash_map 效率快了很多, 按说微软不应该低效的啊...费解ing...

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值