Друзья, всем привет. :) Лень писать самому. Поделитесь пожалуйста, кто уже сделал списки: vector, map и другие.
Может проще будет STL сделать стандартной либой в MQL5? Заранее спасибо за все ответы.
Посмотрите Generic библиотеку для примитивов в последней бете:
Стандартная библиотека MQL5
| |
---|---|
Include\Math\ |
|
Include\OpenCL\ |
|
Include\ |
|
Include\Arrays\ |
|
Include\Generic\ |
|
Include\Files\ |
|
Include\Strings\ |
|
Include\Objects\ |
|
Include\Canvas\ |
|
Include\Charts\ |
|
Include\Graphics\ |
|
Include\Indicators\ |
|
Include\Trade\ |
|
Include\Expert\ |
|
Include\Controls\ |
Посмотрите Generic библиотеку для примитивов в последней бете:
Ура! Долгожданное обновление!
Когда сделаете множественное наследование интерфейсов? Сейчас, простите, это фейк в MQL, т.к. интерфейсы описывают контракт и ничего более, и по определению не могут являться еще одной версией наследования, так как это выполнено сейчас в MQL.
Посмотрите Generic библиотеку для примитивов в последней бете:
Ренат, похоже что бренч бета версии доступен только разработчикам.
Возможно ли выложить папочку generic.zip сюда в ветку? Заранее спасибо.
К слову сказать, подобные вещи интересно было бы выложить в public.
Возможно многие ради интереса закомитят свои 2 кб.
Если вести две ветки по mql5: original и open branch - это позволит интегрироваться и наладить взаимосвязь с командой MQ.
Сообщество само бы толкало развитие в нужную сторону.
Впрочем, это просто мысли вслух.. :))
Ренат, похоже что бренч бета версии доступен только разработчикам.
Возможно ли выложить папочку generic.zip сюда в ветку? Заранее спасибо.
Разобрался. Не нужен архив, бета версия доступна через "live update".
Если кому то понадобится, тут всё подробно написано: https://www.mql5.com/ru/forum/221763.
- 2017.12.05
- www.mql5.com
Посмотрите Generic библиотеку для примитивов в последней бете:
Ренат, безобразно сделаны базовые классы, а архитектура выстроена полностью неверно.
Приведу несколько примеров:
1) CMap базируется на Tree.
Это влияет на всё: на скорость, память, функционал. Мой достаточно мощный ноут при обходе 105 000 нодов тупо крэшит всё(так как используется рекурсия и стек тупо переполняется).
2) Когда виснет эксперт нету отклика от MetaTrader5. Только не говорите, что всё висит на одном процессе?
3) Судя по коду ощущение, что код писал Java Developer. А тут нужен полноценный C/C++ инженер(сеньер) с углубленным знаниям stl контейнеров.
bool TryGetMin(T &min); bool TryGetMax(T &max);
Забавно, что подобные конструкции нигде не используются(разве только в Java?) и в поисковых системах мы тут же попадаем на форум mql5.
4) Что за названия такие глупые по всему проекту?
- CRedBlackTreeNode??? Что это такое???
Как насчёт такого CRedBlackBlueYellowAndRedAgain. :)) PS Сарказм.
- Или кусочек кода
return(m_clr==RED_BLACK_TREE_NODE_BLACK &&
RED_BLACK_TREE_NODE_BLACK_BLACK__BLACK__BLACK__BLACK__BLACK. :)) PS Сарказм.
- Или например, метод WalkNextLevel??? Что за...???
IGoToWalkInThePark. :)) PS Сарказм.
- CSortedMap? Почему не просто CMap?
5) Зачем такая игра состояниями: insert, delete, linked? А если их 10 вариантов будет? На каждый будем плодить свой балансер? с 50 строчками кода?
void BalanceTreeAfterInsert(CRedBlackTreeNode<T>*insert_node); void BalanceTreeAfterDelete(CRedBlackTreeNode<T>*linked_node);
BalanceTree должен быть единственный.
6) Когда я зашёл в код ожидал увидеть, как в stl итераторы begin, end.. А вижу, что CMap состоит из черно-красных деревьев.
7) IsLeaf()?? Что это такое? Что мы хотим этим сделать? Если нужен конец - это iterator end. Проверить пустой или нет -это IsEmpty().
8) А конструктор копирования, тогда зачем?
int CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[],const int dst_start=0); int CopyTo(TKey &dst_keys[],TValue &dst_values[],const int dst_start=0);
9)...
10)...
и т.д.
Всё надо переделывать, так точно не пойдет. Если продолжать развивать подобную архитектуру будут появляться "мелкие глюки", которые будет очень сложно отлавливать.
1) Приведите код
2) Приведите код
3) Вкусовщина
4) Нейминг правильный, чтобы любой понял.
Это только джедаи, пишущие в одиночку, уверены в приемлемости коротких имен. Автокомплит помогает в наборе длинных имен.
5) Вы понятия не имете, что критикуете. Не зная принципа ребалансировки красно-черного дерева, пытаетесь критиковать две базовые функции процессинга.
6) Мало ли что вы хотели увидеть
7) Не вижу проблемы
8) Не вижу проблемы в наличии таких функций
Язык открытый, возьмите и напишите свою библиотеку. А да, я же забыл - вам лень.
Ренат, подобные вопросы активно обсуждались ещё 4 года назад. В стандарте 11, map уже базируется на хэш-таблице.
Какой смысл плодить старые баги? Вообщем как хотите, я высказал всего лишь свое мнение.
- stackoverflow.com
Ренат, безобразно сделаны базовые классы, а архитектура выстроена полностью неверно.
Приведу несколько примеров:
1) CMap базируется на Tree.
Это влияет на всё
...
С чего Вы взяли, что CHashMap базируется на красно-черном дереве?
Сейчас проверил ядро CHashMap. Коллекция хранит пары ключ-значение в массиве m_entries:
//+------------------------------------------------------------------+ //| Class CHashMap<TKey, TValue>. | //| Usage: Represents a collection of keys and values. | //+------------------------------------------------------------------+ template<typename TKey,typename TValue> class CHashMap: public IMap<TKey,TValue> { protected: int m_buckets[]; Entry<TKey,TValue>m_entries[]; ... };
Непосредственно ядро функционала находится в методе Insert:
//+------------------------------------------------------------------+ //| Insert the value with the specified key from the map. | //+------------------------------------------------------------------+ template<typename TKey,typename TValue> bool CHashMap::Insert(TKey key,TValue value,const bool add) { if(ArraySize(m_buckets)==0) Initialize(0); //--- get hash code from key int hash_code=m_comparer.HashCode(key)&0x7FFFFFFF; int target_bucket=hash_code%ArraySize(m_buckets); //--- search pair with specified key for(int i=m_buckets[target_bucket]; i>=0; i=m_entries[i].next) if(m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key)) { //--- adding duplicate if(add) return(false); m_entries[i].value=value; return(true); } ... return(true); }
Из кода видно, что делается попытка угадать индекс по его хешу:
for(int i=m_buckets[target_bucket];...)
Если один и тот же хеш имеет несколько элементов, делается их перебор:
for(int i=m_buckets[target_bucket]; i>=0; i=m_entries[i].next)
... и уже каждый из этих элементов сравнивается с образчиком непосредственно:
if(m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))
Т.е. никакого красно-черного дерева здесь нет.
...
- CSortedMap? Почему не просто CMap?
А понял, когда Вы пишите:
1) CMap базируется на Tree.
имеете в виду CSortedMap (вот видите, сократили имя, и уже понять Вас с первого раза нельзя, а Вы за сокращенный синтаксис ратуете;)
Раз так, Вы здесь тоже не правы. Дело в том, что CSortedMap это коллекция, позволяющая эффективно (за логарифмическое время) вставлять и извлекать элементы из упорядоченной коллекции. Эффективный алгоритм быстрой упорядоченной вставки и извлечения на хеш таблицах не построишь - почему долго объяснять. Для эффективной вставки и извлечения выбор из алгоритмов невелик:
- Бинарное дерево;
- Пирамида: тоже бинарное дерево но в проекции на массив, при этом экономится дополнительная память, т.к. не тратится память на узлы;
- 2-3 деревья.
- Красно-черные деревья - это 2-3 дерево в проекции бинарного дерева.
Т.е. как не крути, а от дерева с его ограничениями не уйти. Исходя из этого выбор в пользу красно-черных деревьев правильное и взвешенное решение.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Друзья, всем привет. :) Лень писать самому. Поделитесь пожалуйста, кто уже сделал списки: vector, map и другие.
Может проще будет STL сделать стандартной либой в MQL5? Заранее спасибо за все ответы.