/* 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...