C++ 在哪里实现哈希函数?

C++ 在哪里实现哈希函数?,c++,c++11,C++,C++11,我使用一个对象作为无序映射中的键,因此我需要定义一个哈希函数。我的问题是,应该在哪里实现哈希函数。我应该把它和类实现放在一起,还是应该把它实现在我需要它的地方 更新: 如果它有区别,所有这些都是基于一个框架的如果您预期需要在许多无序的映射中重用它,请将它放在可见的地方,比如在类中 如果你只需要它来制作一张一次性的无序地图,把它放在你使用它的地方。您甚至可以。如果您预计需要在许多无序地图中重用它,请将其放置在可见的位置,例如在类中 如果你只需要它来制作一张一次性的无序地图,把它放在你使用它的地方。

我使用一个对象作为
无序映射
中的键,因此我需要定义一个哈希函数。我的问题是,应该在哪里实现哈希函数。我应该把它和类实现放在一起,还是应该把它实现在我需要它的地方

更新:
如果它有区别,所有这些都是基于一个框架的

如果您预期需要在许多
无序的映射中重用它,请将它放在可见的地方,比如在类中


如果你只需要它来制作一张一次性的
无序地图
,把它放在你使用它的地方。您甚至可以。

如果您预计需要在许多
无序地图中重用它,请将其放置在可见的位置,例如在类中


如果你只需要它来制作一张一次性的
无序地图
,把它放在你使用它的地方。您甚至可以。

我会把它和类定义放在一起,至少如果您使用
=
作为
无序映射中的相等函数
。实施 哈希函数取决于等式比较的实现, 将两者结合在一起有一个明显的优势,即减少 有人不更改哈希函数的概率,如果他们 更改
==

如果您还为映射定义了一个特殊的相等函数,那么 这两个函数应该一起定义,可能靠近何处
它们将用于实例化映射

我会把它和类定义放在一起,至少如果您使用
=
作为
无序映射中的相等函数
。实施 哈希函数取决于等式比较的实现, 将两者结合在一起有一个明显的优势,即减少 有人不更改哈希函数的概率,如果他们 更改
==

如果您还为映射定义了一个特殊的相等函数,那么 这两个函数应该一起定义,可能靠近何处
它们将用于实例化映射

在我看来,如果哈希函数是如下所示的基本函数,那么它应该是类的方法,也应该是内联的

int hashFunction(long x){
    return (int) (x % N);
}

如果它是一个稍微复杂一点的散列函数,那么它应该是这个类的一个方法,因为你需要一个“N”,这个“N”将是这个类特有的

在我看来,如果哈希函数是如下所示的基本函数,那么它应该是类的方法,也应该是内联的

int hashFunction(long x){
    return (int) (x % N);
}

如果它是一个稍微复杂一点的散列函数,那么它应该是这个类的一个方法,因为你需要一个“N”,这个“N”将是这个类特有的

你能告诉我们你到现在为止实现了什么吗?为什么你需要知道我在问什么?你能告诉我们你到现在为止实现了什么吗?为什么你需要知道我在问什么?在这种情况下,我不会使用
lambda
。您可以确定,如果有人正在修改相等的定义,他们不会想到跟踪用于实例化
无序映射的lambda
。考虑到相等函数和散列函数之间的依赖关系,它们应该在彼此附近定义。@JamesKanze Err。。。在两行连续的代码中彼此“接近”(如我的链接中所示)?如果您也使用特殊的相等函数,这是一个很好的解决方案。我想在很多情况下,相等函数将是对象类型上的<代码> oprAtter=。尝试使用lambda,但从C++获得编译错误。library@NebulaFox您是如何尝试使用它的?您遇到了什么编译器错误?在这种情况下,我不会使用
lambda
。您可以确定,如果有人正在修改相等的定义,他们不会想到跟踪用于实例化
无序映射的lambda
。考虑到相等函数和散列函数之间的依赖关系,它们应该在彼此附近定义。@JamesKanze Err。。。在两行连续的代码中彼此“接近”(如我的链接中所示)?如果您也使用特殊的相等函数,这是一个很好的解决方案。我想在很多情况下,相等函数将是对象类型上的<代码> oprAtter=。尝试使用lambda,但从C++获得编译错误。library@NebulaFox您是如何使用它的?您遇到了什么编译器错误?根据标准,哈希函数的返回类型应该是
size\t
,非
int
。我看不出在什么地方通常需要一个取决于类的
N
。根据标准,哈希函数的返回类型应该是
size\u t
,而不是
int
。我看不出你通常在哪里需要一个取决于类的
N