10

我正在尝试定义一种具有自定义哈希函数和相等比较函数的 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 不是有效的模板类型参数。文档令人困惑,因为它没有确切说明模板参数应该是什么类型 - 我只是应该像我在这里所做的那样给它函数,还是有一些其他类型的对象封装了函数(因为文档确实谈到了“散列函数对象类型”)?

4

2 回答 2

9

不幸的是,这些函数应该在类中声明为运算符 ()。像这样:

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_mapunordered_set其他任何需要哈希函数的对象提供哈希函数,则默认使用此模板。

于 2010-01-20T07:06:47.810 回答
5

你需要函子。

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*/; }
};
于 2010-01-20T07:21:49.490 回答