//+------------------------------------------------------------------+//| 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 的工作原理
,你需要搜索一下条目,可能在这个主题中。
关于交易、自动交易系统和交易策略测试的论坛
通用类库 - 错误、描述、问题、使用的特殊性和建议
Sergey Dzyublik, 2017.12.11 13:41
简要介绍一下当前CHashMap 的实现。
首先,我们来看看什么是Entry<TKey,TValue>。
从本质上讲,它是CLinkedList中的一个Node,它包含。
m_entries[] - "单元格 "数组,用于放置添加的键和值、哈希代码、下一步。阵列的大小与容量相对应。
m_count - 指定m_entries中第一个未使用的单元格的索引。初始值为0,增长到容量,接下来是重建所有阵列,增加容量和所有阵列的大小。
m_buckets[] - m_entries[]的索引阵列。默认值为-1。阵列大小与容量相对应。
没有碰撞,为CHashMap 容器添加唯一值。
在没有碰撞的情况下,通过CHashMap 容器中的键获取值。
碰撞解决。
碰撞,在CHashMap 容器中通过键获取值。
从CHashMap 容器中删除一个值。
重建哈希表(增加容量过程) :
描述的行为来自2017.12.11
目前,可能已经添加/改变了一些细节/系数。
我曾一度拆解并描述了CHashMap 的工作原理
,你需要寻找条目,可能在这个主题中。
我发现它在
关于交易、自动交易系统和策略测试的论坛
通用类库 - 错误、描述、问题、使用的特殊性和建议
Sergey Dzyublik, 2017.12.07 14:21
在这个例子中,哈希值是学生的生日。
我们有一个有365个架子的柜子,里面有学生的日记。
我们把每本日记放在与学生的生日相对应的架子上。
我们需要学生彼得罗夫的日记,我们知道他的出生时间。
现在通过O(1)中的出生日期,我们可以很容易地找到彼得罗夫的日记,以及任何其他学生的日记。
例外情况是两个学生有相同的生日--这被称为撞车。
解决碰撞问题是利用额外的信息来找出我们需要的两个或多个期刊中的哪一个。
通过列表进行碰撞解决,就是简单地将碰撞中的所有条目一个一个地找出来,找到一个匹配。撕下每本日记,看看是谁的。
一个子标题是组织一个参与碰撞的项目的哈希表,但以不同的标准。例如,按学生出生的时间。
如果你对这个话题感兴趣--我建议在youtube上学习MailRu关于算法和数据结构 的课程。
关于交易、自动交易系统和交易策略测试的论坛
通用类库 - 错误、描述、问题、使用的特殊性和建议
Sergey Dzyublik, 2017.12.08 14:40
关于这个话题的基础知识是为懒惰的人准备的。
https://www.slideshare.net/mkurnosov/6-32402313
在现实中,它要复杂得多,并在相关文献或良好的 "算法和数据结构 "课程中讨论。
谢谢,调试有帮助。有小名单的碰撞。捋了捋这条线,吓了一跳。事实证明,我一直在讨论这个问题......
截至目前,可能已经增加/改变了一些细节/系数。
非常感谢您!对你的描述有很大帮助。