0001 template <typename K, typename V> void Hashtable<K,V>::rehash() { //重散列 0002 Entry<K,V>** ht0 = ht; Rank M0 = M; M = primeNLT(4*N); //新的容量 0003 ht = new Entry<K,V>*[M]; memset(ht, 0, sizeof(Entry<K,V>*)*M); //新的桶数组 0004 delete[] used; used = new bool[M]; memset(used, 0, sizeof(bool)*M); //新的标志数组 0005 for (Rank i = 0; i < M0; i++) //散列函数与表长相关,故扩容后不可简单地整体复制数据区 0006 if (ht0[i]) //而只能逐个地将每个词条 0007 { get(ht0[i]->key); ht[_s] = ht0[i]; used[_s] = true; } //移入新表 0008 U = N; delete[] ht0; //释放原表 0009 } //rehash:极端情况下,容量可能不扩反缩