c – 为unordered_map定义自定义哈希函数和相等函数

前端之家收集整理的这篇文章主要介绍了c – 为unordered_map定义自定义哈希函数和相等函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图定义一种具有自定义哈希函数和等式比较函数的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不是有效的模板类型参数.这个文档很混乱,因为它并没有说明什么样的模板参数应该是什么类型的 – 我只是给它这个函数,就像我在这里一样,还是有一些封装函数的其他类型的对象(因为文档确实在谈论“哈希函数对象类型”)?

解决方法

那些函数在一个类中应该被声明为一个operator(),不幸的是.喜欢这个:
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以及需要散列函数的其他任何东西,默认使用这个模板.

猜你在找的C&C++相关文章