通用类库 - 错误、说明、问题、使用功能和建议 - 页 20

 
谢尔盖-迪尤布利 克。

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超限的检查。

   if((uint)new_size>INT_MAX && INT_MAX>old_size)
      return INT_MAX;
   else
      return GetPrime(new_size);

在我看来,这些方法的行为背后的逻辑是绝对毫不含糊和正确的。


关于第二个和第三个项目。

你建议的改变在大多数情况下只与边缘问题有关,当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方法得到一个非简单数字的情况,是我迄今为止遇到的唯一一个案例。这一事件将通过改变生成质数时的检查来解决。

//--- outside of our predefined table
   for(int i=(min|1); i<=INT_MAX; i+=2)
     {
      if(IsPrime(i) && ((i-1)%s_hash_prime!=0))
         return(i);
     }
   return(min);

2.CPrimeGenerator::IsPrime方法被用来检查数字 的简单性

 

试着从我的ArrayList切换到你的ArrayList,它在Generic/ArrayList.mqh中。

ME在". "之后没有给出任何东西。

我怎样才能得到这个价值?类中缺少Get()和[]。

而且它没有考虑到可能有一个数组的指针。

那么谁来创建这个图书馆呢?

这里是我在Java中的ArrayList版本。

附加的文件:
ArrayList.mqh  46 kb
 
当我创建这个变体时,没有类模板。
 
罗曼-科诺佩尔科

为了使Generic集合能够正确地与类对象一起工作,这些类必须实现IEqualityComparable接口,其中Equals和HashCode方法被定义。这意味着,用户必须设置哈希代码的计算方法,这是迄今为止唯一的选择,因为不可能像在.Net中那样自动实现这些方法,例如,通过MQL5。

那么为什么你的模板能与任何类型一起工作,误导了程序员? 如果只有从IEqualityComparable继承的类能正确工作,那么我们应该在编译器级别禁止与其他类型一起工作。

让我提醒你这个代码。

//+------------------------------------------------------------------+
//| 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 object
      return GetHashCode(typename(value));
     }
  }

我相信这个功能应该被这个功能所取代。

template<typename  T>
int GetHashCode(IEqualityComparable<T> &value)
  {
    return value.HashCode()
  }
 
阿列克谢-纳沃伊科夫

那么为什么你的模板能与任何类型一起工作,误导了程序员? 如果只有从IEqualityComparable继承的类能正确工作,那么你应该在编译器级别禁止与其他类型一起工作。

使用这种类型的工作会很不方便。标准类型的GetHashCode重载显示了获取哈希代码的界面。


令人恼火的是,它不存在。

template<typename T>
interface IEqualityComparable
  {
//--- method for determining equality
   bool              Equals(T & value);
//--- method to calculate hash code   
   int               HashCode(void);
  };


即为对象无赖了。

 
fxsaber:

这在工作上会很尴尬。标准类型的GetHashCode重载显示了获取哈希代码的接口。

现在有什么方便的呢? 事实上,把一个不支持接口的类的枚举或指针传到这个函数中,你只是得到了类的名字? ) 最重要的是,代码的运行和编译就像一切正常一样。

 
阿列克谢-纳沃伊科夫

现在有什么好处呢? 把一个不支持接口的类的枚举或指针传到这个函数中,你只得到类的名字? 真棒!)最重要的是,代码可以工作,编译起来就像一切正常一样。 事实并非如此。

是的,他们制造了一个垃圾。他们不假思索地从NetFramework中复制和粘贴,而很明显,如果没有语言层面的接口支持,它就不能充分地工作。我记得6-7年前MQ代码的水平,现在和那个时候相比是垃圾。

 
Alexey Navoykov:

现在有什么方便的呢? 事实上,把一个枚举或一个不支持接口的类的指针传到这个函数中,你只是得到了类的名字? 不错的哈希)而且最重要的是,代码的运行和编译,好像一切都很好。 事实并非如此。

我同意,马上得到一个编译错误 比处理为什么不工作的漫长问题要好。

说实话,我甚至不明白他们为什么要在那里贴上一个界面。毕竟,你只需要为所需类型重载GetHashCode,而不是开始创建IEqualityComparable。