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

 
fxsaber:

关于从一个键获取一个值的问题。在库的代码中,这个方法看起来是这样的

//+------------------------------------------------------------------+
//| Find index of entry with specified key.                          |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
int CHashMap::FindEntry(TKey key)
  {
   if(m_capacity!=NULL)
     {
      //--- get hash code from key
      int hash_code=m_comparer.HashCode(key)&0x7FFFFFFF;
      //--- search pair with specified key
      for(int i=m_buckets[hash_code%m_capacity]; i>=0; i=m_entries[i].next)
         if(m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))
            return(i);
     }
   return(-1);
  }

是的,这段代码可能有误导性,因为i在for中的非标准的重新分配。

首先,我们通过索引访问子数组,它可能包含我们的值:i=m_buckets[hash_code%m_capacity]; (即子数组或值仓的i索引)

然后,在同一个for中,bin索引被转变成bin项目索引:i=m_entries[i].next

事实上,这段代码写得很正确,因为在一个典型的案例中,每个子数组平均 有一个项目,循环平均只执行一次。

 
Vasiliy Sokolov:

是的,这段代码可能有误导性,因为i在for中的非标准的重新分配。

首先,我们通过索引访问一个子数组,其中可能包含我们的值:i=m_buckets[hash_code%m_capacity]; (即子数组或篮子值的i索引)

然后,在同一个for中,bin索引被转变成bin项目索引:i=m_entries[i].next

事实上,这段代码写得很正确,因为在一个典型的案例中,每个子数组平均 包含一个项目,循环平均只执行一次。

我明白,这个循环是为了碰撞而做的:要通过小名单。

 
fxsaber:

我认为这个循环是为碰撞而做的:要通过一个小型的清单。

是的,完全正确。

 

使用模板库(CArrayList)来存储自定义类型。印象不是很好。为了方便起见,我写了一些宏程序

#define  CLEANUP   do {                                      \
   for(int i_cln = 0;  i_cln < segs.Count();  ++ i_cln) {   \
      Wave_end *cln_el;                                     \
      if(  segs.TryGetValue(i_cln, cln_el) )                \
         delete cln_el;                                     \
   }}while(false)
#define  SSEG(IND)  do {                \
if( ! segs.TryGetValue(IND, we) ) {    \
   CLEANUP;                            \
   continue;                           \
}}while(false)

TryGetValue中过多的防骗措施+不可能按值传递类,使得使用起来很痛苦。

 
与本主题无关的评论已被移至"来自MQL5 MT5 MetaTrader 5初学者的问题"。
 

告诉我,也许我不明白什么,但如果我试图使用这种类型的结构。

#include <Generic\\ArrayList.mqh>

struct Option {
   string name;
   color  clr;
};

...

CArrayList<Option> _options;

我得到一个错误。

'Option' - 对象只通过引用传递 ICollection.mqh 14 18

然后有一大堆的错误...
 
Andrey Pogoreltsev:

告诉我,也许我不明白什么,但如果我试图使用这种类型的结构。

我得到一个错误。

'Option' - 对象只通过引用传递 ICollection.mqh 14 18

而接下来有一整堆的错误...

像这样试试吧。

#include <Generic\\ArrayList.mqh>

class Option {
   string name;
   color  clr;
};

...

CArrayList<Option*> _options;
 
Sergey Eremin:

这样试试吧。

传递/存储指向一个集合的指针在概念上是错误的。

 
Andrey Pogoreltsev:

传递/存储指向一个集合的指针在概念上是错误的。

没有任何一个MQL的通用程序是稍微合适的。所有这些程序都有严重的错误。

 
TheXpert:

没有任何一个MQL的通用程序是稍微合适的。所有这些程序都有严重的错误。

嗯,是的,我已经使用了一个数组。如果它们只适用于内置类型,为什么要创建集合并将其放入kodobase?)