我正在尝试创建一个使用模板的哈希图。在探测和探测的情况下,模板将接受一个哈希函数(hash (int key, int size) 的形式)和一个探测函数(probe (int i) 的形式)(int key, int size)在双重哈希的情况下。我希望你明白我在说什么。这是我的主要内容:
#include "generic_map.h"
inline int hash( int key, std::size_t M ) { return key % M; }
inline int hash2( int key, std::size_t M ) { return key % (M-1) + 1; }
inline int linear_probe( int i ) { return i; }
inline int quadratic_probe( int i ) { return i*i; }
int main() {
generic_map<int, char, int(*)(int,std::size_t), hash, int(*)(int), quadratic_probe, false> map1( 20);
generic_map<int, char, int(*)(int,std::size_t), hash, int(*)(int, std::size_t), hash2, true> map2( 20);
}
如您所见,我传入了两种不同的指针函数类型作为探测函数。在双重哈希的情况下,“Hash2”将作为探测函数传入。这是我的头文件中的一个片段(即我的类声明、节点声明和插入方法:
template <class KEY, class VALUE, class HASH_FUNC, HASH_FUNC hash, class PROBE_FUNC, PROBE_FUNC probe, bool double_hash>
//Hashmap Class
class generic_map {
private:
//Node Class
struct hashNode {
KEY key; //Stores the key of node
VALUE value; //Stores the value that associates to key
hashNode(KEY key, VALUE &value) : key(key), value (value) {} //hashNode constructor
};
public:
//Creates a new backing array with user inserted capacity
generic_map( int capacity ) {
M = capacity;
map = new hashNode * [capacity];
for(int i = 0; i < M; ++i) {
map[i] = NULL;
}
}
//Deletes the hashNodes in the list and the map
~generic_map() {
clear();
}
//If index that key hashes to is empty, insert. Else, replace value at hashed index.
int insert( KEY key, VALUE value ) {
int f = hash( key, M );
int p = 0;
int h = f;
while( map[h] != NULL ) {
if( p == M )
return -1 * p;
if( map[h]->key == key ) {
map[h]->value = value;
return p;
}
else {
++p;
if(double_hash) {
h = f + (p * probe(key, M)) % M;
}
else {
h = f + (probe( p )) % M; //This is throwing an error and will not compile,
} //saying, "too few arguments to function call.
}
}
我的插入方法中的“double_hash_”条件的“else”部分标记了一个错误,因为我当然是在使用两个不同的参数号调用同一个探针、模板函数。我不是在问为什么它会抛出错误,因为我已经知道为什么。我正在寻求解决方案 - 或解决方法。谢谢。