汎用クラスライブラリ - バグ、説明、質問、使用上の特徴、提案 - ページ 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);
  }

はい、このコードはforのiが非標準的に再割り当てされているため、誤解を招く可能性があります。

i=m_buckets[hash_code%m_capacity];(すなわち、サブ配列または値ビンのi番目のインデックス)

次に、同じforで、binのインデックスをbinのアイテムのインデックスに変える:i=m_entries[i].next

なぜなら、典型的なケースでは、各副配列は平均して 1つの項目を持ち、ループは平均して1回だけ実行されるからです。

 
Vasiliy Sokolov:

はい、このコードはforのiが非標準的に再割り当てされているため、誤解を招く可能性があります。

i=m_buckets[hash_code%m_capacity];(すなわち、サブアレイまたは値のバスケットのiインデックス)

次に、同じforで、binのインデックスをbinのアイテムのインデックスに変える:i=m_entries[i].next

実際、このコードは正しく書かれています。なぜなら、典型的なケースでは、それぞれの部分配列は平均して 1つの項目を含み、ループは平均して一度だけ実行されるからです。

ループは衝突のために作られている:ミニリストを通過するためと理解しています。

 
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 MetaTrader5初心者からの質問」に移動しました。
 

教えてください、何か理解できていないかもしれませんが、このタイプの構造を使おうとすると。

#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に入れるのでしょうか?)