为 unordered_map 定义自定义散列函数和相等函数
Posted
技术标签:
【中文标题】为 unordered_map 定义自定义散列函数和相等函数【英文标题】:Defining custom hash function and equality function for unordered_map 【发布时间】:2010-01-20 06:56:39 【问题描述】:我正在尝试定义一种具有自定义哈希函数和相等比较函数的 unordered_map。这些函数的函数原型如下:
//set<Vertex3DXT*> is the type of the key; Cell3DXT* is the type of the value
size_t VertexSetHashFunction(set<Vertex3DXT*> vertexSet); //hash function
bool SetEqual(set<Vertex3DXT*> a, set<Vertex3DXT*> b); //equality
我声明了这些函数原型,然后我尝试如下声明类型:
typedef std::tr1::unordered_map<set<Vertex3DXT*>, Cell3DXT*, VertexSetHashFunction, SetEqual> CellDatabaseMapType;
但它说 VertexSetHashFunction 和 SetEqual 不是有效的模板类型参数。该文档令人困惑,因为它没有准确说明模板参数应该是什么类型 - 我只是应该像我在这里所做的那样给它函数,还是有一些其他类型的对象封装了函数(因为文档确实谈到了“哈希函数对象类型”)?
【问题讨论】:
你还关心这个问题吗? 感谢您的提醒 - 其中一个答案是我想要的答案,但我只是忘记接受了。我现在才接受。 【参考方案1】:不幸的是,这些函数应该在类中声明为运算符 ()。像这样:
class VertexSetHashFunction
public:
::std::size_t operator ()(const ::std::set<Vertex3DXT*> &vertexSet) const;
;
class SetEqual
public:
bool operator ()(const ::std::set<Vertex3DXT*> &a, const ::std::set<Vertex3DXT*> &b) const;
;
您不必将参数修改为 const 引用,但我强烈推荐它。制作 ::std::set 的副本相对昂贵,除非万不得已,否则不应这样做。
尾随的 const 只是因为操作符实际上并没有修改类状态,主要是因为没有。能这么明确地说出来就好了。
或者,您可以定义自己的 ::std::hash 模板的特化。如果您希望以一种标准方式对特定集合进行哈希处理,我实际上会推荐此方法,因为如果您不向 unordered_map
或 unordered_set
提供哈希函数以及其他任何需要哈希函数的内容,则默认使用此模板。
【讨论】:
【参考方案2】:你需要函子。
struct VertexSetHashFunction
size_t operator() (const set<Vertex3DXT*>& vertexSet) const return /*whatever*/;
;
struct SetEqual
bool operator() (const set<Vertex3DXT*>& a, const set<Vertex3DXT*>& b) const return /*whatever*/;
;
【讨论】:
@njamesp:当我在 SetEqual 中编写return false;
时,您真的认为我希望 OP 实现该功能吗? 叹息
注意,在 KennyTM 的例子中,仿函数也可以是结构体。以上是关于为 unordered_map 定义自定义散列函数和相等函数的主要内容,如果未能解决你的问题,请参考以下文章