1

我需要使用与默认值不同的哈希器建立一个哈希表,所以我写了如下内容:

class foo {
public:
...
private:
  struct myhasher {
    size_t operator() (myclass bar) { return hash_calculation bar; }
  }
  static size_t hash_calculation (myclass bar) {
    // do some calculation
  }
  hash_map<myclass, myhasher> myhashmap;
}

有用。现在由于某种原因,我必须编写一个非静态成员函数来替换 hash_calculation,比如说,它需要一个类的非静态成员作为参数。然后整个事情失败了,因为我不能在嵌套结构中使用非静态方法。

这在某种程度上类似于另一个广泛讨论的问题:如何使用非静态函数进行比较或排序。参见例如: 在比较函数中使用非静态类成员C++ std 列表排序与自定义比较器,该比较器依赖于对象实例的成员变量。他们都建立了一个函子而不是一个函数作为比较器。但是在我的情况下,这个技巧不起作用,因为我需要 hash_map 定义中的类名,而不是特定的结构对象。我应该怎么办?在此先感谢您的帮助!

4

2 回答 2

1

你不能。应该如何知道调用时应该使用hash_map哪个实例?myhashermyhaser::hash_calculation

hash_map不是标准 C++ 库的一部分,甚至在 C++11 中也不是,所以它是一个自定义类,并且您没有包含有关它如何工作的信息。如果有办法让它使用某种构造函数参数,myhasher那么你很幸运。但听起来不像。

此外,当您可能打算传入 const 引用时,您正在使用按值传递。按值传递可能会非常缓慢且效率低下。

于 2012-10-25T18:36:07.220 回答
0

标准的“hash-map”,即,std::unordered_map<K, V, H, E, A>将类型的散列对象H作为构造函数参数。此对象的副本用于通过函数调用运算符确定对象的哈希值。这种方式可以提供一些上下文。显然,您已经在使用非静态函数调用运算符,但您选择委托给静态成员。

于 2012-10-25T19:06:29.040 回答