加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:04:24 所属栏目:百科 来源:网络整理
导读:我试图定义一种具有自定义哈希函数和等式比较函数的unordered_map类型.这些功能的功能原型如下: //setVertex3DXT* is the type of the key; Cell3DXT* is the type of the valuesize_t VertexSetHashFunction(setVertex3DXT* vertexSet); //hash functionbo
我试图定义一种具有自定义哈希函数和等式比较函数的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以及需要散列函数的其他任何东西,默认使用这个模板.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读