要构造一个散列表,第二步(第一步比较简单就不说了,主要是得到hashcode与构造哈希表)也是最关键的一步就是碰撞处理。
一种直接的办法就是将大小为M的数组中的每个元素都指向一条链表(此处用二维数组来表示),链表中每个结点都储存了散列值为当前键的值,这种方法叫做拉链法。
template<typename T,typename V>
class hashST
{
public:
hashST(int m)
{
this->m = m;
st.resize(m);
}
V get(T key)
{
return st[hash(key)][0];
}
void put(T key, V value)
{
st[hash(key)].push_back(value);
}
private:
int n; //键对总数
int m; //线性表大小
std::vector<std::vector<V>> st;
int hash(T key)
{
std::hash<T> hash_t;
return (hash_t(key) & 0x7fffffff) % m;
}
};
下一篇我们会介绍基于线性探测法的散列表。
关于我一直使用STL-vector这件事,我用vector是基于以下几点考虑:- vector更加的安全,不容易发生内存泄漏等问题
- vector与java的语法更加相像,所以更方便执行书中的操作,也更方便理解
- vector有很多现成的方法,方便我们进行调用而不必过多的重新构造相应方法
(这可不是因为我懒哈)