📄 hashset.cpp
字号:
#include "hashset.h"
using namespace std;
template <typename key_type, typename hash_func, typename key_equal>
bool HashSet<key_type, hash_func, key_equal>::search(const key_type& k) {
int p = hf(k) % table_size();
while ((*ht)[p].used) {
if (eq((*ht)[p].key, k)) { // equality predicate for key_type
return true;
}
p++;
if (p == table_size()) {
p = 0; // wrap around to beginning
}
}
return false;
}
template <typename key_type, typename hash_func, typename key_equal>
void HashSet<key_type, hash_func, key_equal>::remove(const key_type& k){
int p = hf(k) % table_size();
while ((*ht)[p].used) {
if (eq((*ht)[p].key, k)) {
(*ht)[p].used = false;
entries--;
break;
}
p++;
if (p == table_size()) {
p = 0; // wrap around to beginning
}
}
}
template <typename key_type, typename hash_func, typename key_equal>
void HashSet<key_type, hash_func, key_equal>::insert(const key_type& k) {
if (load_factor() > .7) {
resize();
}
int pp = hf(k) % table_size();
int p = pp;
while (p < table_size() && (*ht)[p].used) {
p++;
}
if (p == table_size()) {
p = 0;
}
while ((*ht)[p].used) {
p++;
}
(*ht)[p].key = k;
(*ht)[p].used = true;
entries++;
}
template <typename key_type, typename hash_func, typename key_equal>
int HashSet<key_type, hash_func, key_equal>::resize() {
if (prime == num_primes - 1) {
cerr << "maximal table size reached, aborting ... " << endl;
exit(2);
}
int mm = prime_list[prime];
prime++;
int m = prime_list[prime];
vector<Entry>* ptr = new vector<Entry>(m);
for (int i = 0; i < mm; ++i) {
if ((*ht)[i].used) {
key_type kk = (*ht)[i].key;
int p = hf(kk) % m;
while (p < m && (*ptr)[p].used) {
p++;
}
if (p == m) {
p = 0;
}
while ((*ptr)[p].used) {
p++;
}
(*ptr)[p].key = kk;
(*ptr)[p].used = true;
}
}
delete ht;
ht = ptr;
return m;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -