2015-02-24 49 views
0

我来自Java,我对C++和C有一些了解,但并不深入。我创建散列表类,它将封装存储值和密钥。但问题是什么是更好的方法来传递,例如,在构造函数自定义函数中,它将计算表中的散列键。在C++中使用函数作为类成员

在java中,我会使用函数(接口)将其设置为类成员。在C++中使用函数指针作为成员的最佳做法是什么?请建议如何执行此操作。

+6

你为什么不使用'的std :: map'(或无序变体) ? – Mat 2015-02-24 18:35:03

+0

@Mat我认为这是一项家庭作业。对于OP来说,如果你嘲笑你期望的构造函数签名和散列方法签名会很有帮助,因为这个问题有很多可能的解决方案。 – aruisdante 2015-02-24 18:36:56

+0

你的类是模板还是固定的键和值类型? – leemes 2015-02-24 18:37:26

回答

1

C++的做法是将参数化与可调用类型的类,将计算散列:

template<class Key, class Value, class Hash> class hashtable; 

这允许具有任何可调用对象作为哈希函数,无论是纯功能或仿函数对象。

然后通过在构造函数中调用对象:

template<class Key, class Value, class Hash> 
class hashtable 
{ 
    hashtable(Hash h); 
}; 

这可以让你无需创建新类指定不同的散列函数。

最后,为了使申报和hashtable的建设更方便,我们指定的默认模板参数和构造函数参数:

template<class Key, class Value, class Hash = std::hash<Key> > 
class hashtable 
{ 
    hashtable(Hash h = Hash()); 
}; 
+0

感谢您的回答。与Java相同。但是如果需要在运行时更改哈希函数呢? – brvtzhhu 2015-02-24 20:41:51

+0

你可以有另一种方法 - 'rehash(Hash new_hash)'。如果您担心这个新的散列函数必须与旧散列函数的类型相同,您可以在'std :: function'中隐藏具体类型。 – 2015-02-24 20:45:15

相关问题