//+------------------------------------------------------------------+//| CompareFunction.mqh |//| Copyright 2016-2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#include <Generic\Interfaces\IComparable.mqh>
//+------------------------------------------------------------------+//| Compares two objects and returns a value indicating whether one |//| is less than, equal to, or greater than the other. |//+------------------------------------------------------------------+int Compare(constbool x,constbool y)
{
if(x>y)
return(1);
elseif(x<y)
return(-1);
elsereturn(0);
}
template<typename TKey,typename TValue>
class CHashMap: public IMap<TKey,TValue>
{
protected:
int m_buckets[];
Entry<TKey,TValue>m_entries[];
int m_count;
int m_free_list;
int m_free_count;
IEqualityComparer<TKey>*m_comparer;
bool m_delete_comparer;
.................................
この関数はグローバルに宣言されています。そのため、ユーザーによる比較と矛盾しています。
名前の衝突を減らすために、作者はすべてのグローバル補助Generic関数をpublic-static-methodsにすることができますか?
fxsaber:
名前の衝突を減らすために、作者はすべてのグローバル補助Generic関数をpublic-static-methodsにすることができますか?
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
コンパイラのバグ:'operator='-構造体がオブジェクトを持ち、コピーできない
これは当分の間です。誰かのライブラリを取り込みたい場合、作者があなたと同じように「プリミティブ」に書いていて、クラスや関数の名前も同じものを使っていることがわかるでしょう。
マクロで釘付けにします。
自分のことを言ってるんじゃないんです。
このページを全部読んだけど、使い方がよくわからないんだけど?
どなたか例を教えてください。
このページを全部読んだけど、使い方がよくわからないんだけど?
どなたか例を教えてください。
忘れてください。今のままでは使えません。代わりに標準のCObject+CDictionary を使用します。ほとんどの作業では、これで十分です。
キーによる値の取得についての質問です。ライブラリのコードでは、このメソッドは次のようになります。
ソースによるMEナビゲーションツール(ALT+GとCTRL+-)は、このライブラリでは動作しない。そのため、ロジックの追跡が非常に困難です。特に、ハイライトされたループの初期値がまだわかっていないんです。しかし、もし速度があるならば、この値はキーの数よりずっと少ないはずだという理解があります。
この機能で達成される速度はどの程度なのか、アイデアを明確にしてください。オーバーキルは明らかに存在する。でも、なぜか短いらしい。
SZ デバッガーを順を追って見ていきました。例題はすべてクリア TKey = int: m_bucket[Array[i]] = i.Array[i] == Array[j] (i != j)の場合の衝突のみ不明です。
キーによる値の取得についての質問です。ライブラリのコードでは、このメソッドは次のようになります。
この機能を高速にするのは何か、アイデアを明確にしてください。オーバーシュートが明らかに出ている。でも、なぜか短いらしい。
一時期、CHashMapの 仕組みを復習して記述していました
エントリを検索する必要があります、おそらくこのスレッドにあると思います。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
汎用クラスライブラリ - バグ、説明、質問、使用上の特殊性、提案
セルゲイ・デジブリク さん 2017.12.11 13:41
現在のCHashMapの 実装について簡単に説明します。
まず、Entry<TKey,TValue>とは 何かについて説明します。
基本的にはCLinkedListのようなNodeで、これを含んでいます。
m_entries[] - 追加されたキーと値、hash_code、next が配置される "セル" の配列。アレイの大きさは容量に相当します。
m_count - m_entries の最初の未使用セルのインデックスを指定する。初期値は0であり、Capacityまで成長し、次にCapacityと全アレイのサイズを増加させながら全アレイをリビルドする。
m_buckets[] - m_entries[] のインデックス配列.初期値は-1である。アレイサイズは容量に相当する。
衝突しない、CHashMap コンテナに一意な値を追加する。
CHashMap コンテナのキーで値を取得する。
衝突を解決する
衝突、CHashMap コンテナのキーで値を取得する。
CHashMap コンテナから値を削除する。
ハッシュテーブルを再構築する(容量増加処理):
2017.12.11
現在、詳細/係数を追加/変更した可能性があります。
私は一度、CHashMapの 仕組みを分解して説明したことがあります
多分このスレッドで、エントリーを探す必要があります。
で見つけました。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
汎用クラスライブラリ - エラー、説明、質問、使用上の特殊性、提案
セルゲイ・デジブリク さん 2017.12.07 14:21
この例では、ハッシュは生徒の誕生日である。
365段の棚に生徒の日記を収めた食器棚があります。
日記は誕生日ごとに棚に並べています。
弟子ペトロフの日記が必要で、彼がいつ生まれたかもわかっている。
さて、O(1)の生年月日から、ペトロフの日記も、他の生徒の日記も、簡単に見つけることができる。
ただし、2人の生徒が同じ誕生日の場合は例外で、これをコリジョン(衝突)と呼びます。
衝突を解決することは、余分な情報を使って、2つ以上の雑誌のうちどれが必要かを見つけることである。
リストによるコリジョン解消は、コリジョンの全エントリーを1つずつ調べて一致するものを見つけるだけです。日記を一枚一枚はがして、誰のものかを確認する。
サブハッシュとは、衝突に関与した項目のハッシュ表を整理することですが、別の基準で整理します。例えば、生徒が生まれた時間単位で。
もしこのトピックに興味があるのなら、私はYoutubeでMailRuからアルゴリズムとデータ構造についての コースをアドバイスしています。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
Generic クラスライブラリ - エラー、説明、質問、使用上の特殊性、提案
セルゲイ・デジブリク さん 2017.12.08 14:40
このトピックの基本は、怠け者のためのものです。
https://www.slideshare.net/mkurnosov/6-32402313
実際にはもっと複雑で、関連する文献や「アルゴリズムとデータ構造」の講座で議論されている。
ありがとうございます、デバッグが役に立ちました。コリジョン用の小さなリストがあります。スレを駆け足で見て、ゾッとした。話題になっていたことが判明...。
現時点では、細部や係数を追加・変更した場合があります。
ありがとうございました。説明文がとても役に立ちました。