//+------------------------------------------------------------------+//| Returns a hashcode for custom object. |//+------------------------------------------------------------------+template<typename T>
int GetHashCode(T value)
{
//--- try to convert to equality comparable object
IEqualityComparable<T>*equtable=dynamic_cast<IEqualityComparable<T>*>(value);
if(equtable)
{
//--- calculate hash by specied method return equtable.HashCode();
}
else
{
//--- calculate hash from name of objectreturn GetHashCode(typename(value));
}
}
我相信这个功能应该被这个功能所取代。
template<typename T>
int GetHashCode(IEqualityComparable<T> &value)
{
return value.HashCode()
}
1.消除模棱两可的行为。
如果我们将 "INT_MAX - 10 "作为参数传递给CPrimeGenerator::ExpandPrime,结果将是 "INT_MAX"。
如果我们将 "INT_MAX - 10 "作为参数传递给CPrimeGenerator::GetPrime,将返回同样的结果:"INT_MAX - 10"。
在这两种情况下,返回的值都不是质数,从而误导了用户。
关于第一点。
这里没有任何含糊之处。
GetPrime方法应该返回最接近的素数,但是在INT_MAX- 10到INT_MAX的区间内没有素数,这就是为什么返回INT_MAX - 10。
ExpandPrime方法首先将输入值加倍,然后根据收到的数字调用GetPrime方法。
此外,ExpandPrime有一个INT_MAX超限的检查。
在我看来,这些方法的行为背后的逻辑是绝对毫不含糊和正确的。
关于第二个和第三个项目。
你建议的改变在大多数情况下只与边缘问题有关,当CHashMap大小非常大时。然而,不能保证它们会对性能产生积极的影响,因此需要进行单独的研究,以确定你建议的变化是否正确。
这里没有任何含糊之处。
GetPrime方法应该从上面返回最接近的素数,但是在INT_MAX- 10和INT_MAX之间没有素数,所以返回INT_MAX - 10。
ExpandPrime方法首先将输入值加倍,然后从收到的数字中调用GetPrime方法。
此外,ExpandPrime有一个INT_MAX超限的检查。
这些方法行为的逻辑绝对是毫不含糊和正确的。
1.这些函数可能会返回未知数而不是素数。
用户如何使用这些数据是他的问题,也许他把这些数据投到长,然后传给超级计算功能,谁在乎呢。
事实是,我们可能会返回一些与默认声明和预期的函数不同的东西。
2.我们如何检查函数调用返回的是一个质数而不是其他东西?
你不能简单地将其与INT_MAX进行比较。
你必须把它与最后一个小于INT_MAX的可用素数进行比较。
每次将这些函数的调用结果与一些神奇的数字相比较,以确保一切正常,我都觉得很荒谬。
1.这些函数可能不会返回质数,但会返回模糊不清的数字。
用户如何使用这些数据是他的问题,也许他把这些数据铸成long,然后传给超级计算函数,谁在乎呢。
事实是,我们可能会返回一些与默认声明和预期的函数不同的东西。
2.我们如何检查函数调用返回的是一个质数而不是其他东西?
你不能简单地将其与INT_MAX进行比较。
你必须将其与最后一个小于INT_MAX的可用素数进行比较。
每次调用这些函数的结果都要与一些神奇的数字进行比较,以确保一切正确,这在我看来是很荒谬的。
1.你使用GetPrime方法得到一个非简单数字的情况,是我迄今为止遇到的唯一一个案例。这一事件将通过改变生成质数时的检查来解决。
2.CPrimeGenerator::IsPrime方法被用来检查数字 的简单性
试着从我的ArrayList切换到你的ArrayList,它在Generic/ArrayList.mqh中。
ME在". "之后没有给出任何东西。
我怎样才能得到这个价值?类中缺少Get()和[]。
而且它没有考虑到可能有一个数组的指针。
那么谁来创建这个图书馆呢?
这里是我在Java中的ArrayList版本。
为了使Generic集合能够正确地与类对象一起工作,这些类必须实现IEqualityComparable接口,其中Equals和HashCode方法被定义。这意味着,用户必须设置哈希代码的计算方法,这是迄今为止唯一的选择,因为不可能像在.Net中那样自动实现这些方法,例如,通过MQL5。
那么为什么你的模板能与任何类型一起工作,误导了程序员? 如果只有从IEqualityComparable继承的类能正确工作,那么我们应该在编译器级别禁止与其他类型一起工作。
让我提醒你这个代码。
我相信这个功能应该被这个功能所取代。
那么为什么你的模板能与任何类型一起工作,误导了程序员? 如果只有从IEqualityComparable继承的类能正确工作,那么你应该在编译器级别禁止与其他类型一起工作。
使用这种类型的工作会很不方便。标准类型的GetHashCode重载显示了获取哈希代码的界面。
令人恼火的是,它不存在。
即为对象无赖了。
这在工作上会很尴尬。标准类型的GetHashCode重载显示了获取哈希代码的接口。
现在有什么方便的呢? 事实上,把一个不支持接口的类的枚举或指针传到这个函数中,你只是得到了类的名字? ) 最重要的是,代码的运行和编译就像一切正常一样。
现在有什么好处呢? 把一个不支持接口的类的枚举或指针传到这个函数中,你只得到类的名字? 真棒!)最重要的是,代码可以工作,编译起来就像一切正常一样。 事实并非如此。
是的,他们制造了一个垃圾。他们不假思索地从NetFramework中复制和粘贴,而很明显,如果没有语言层面的接口支持,它就不能充分地工作。我记得6-7年前MQ代码的水平,现在和那个时候相比是垃圾。
现在有什么方便的呢? 事实上,把一个枚举或一个不支持接口的类的指针传到这个函数中,你只是得到了类的名字? 不错的哈希)而且最重要的是,代码的运行和编译,好像一切都很好。 事实并非如此。
我同意,马上得到一个编译错误 比处理为什么不工作的漫长问题要好。
说实话,我甚至不明白他们为什么要在那里贴上一个界面。毕竟,你只需要为所需类型重载GetHashCode,而不是开始创建IEqualityComparable。