стандартные классы, класс CQueue

 

Здравствуйте!

#include <Generic\Queue.mqh>
void OnStart()
  {
   CQueue<int> meQ = new CQueue<int>(0);
   for(int i=0; i<5; i++)
     {
      meQ.Enqueue(i);
     }   
      meQ.Dequeue();
      meQ.TrimExcess();
      Print("you are here");
  }

Вот это точно так должно работать, что после Dequeue и TrimExcess в хвост очереди прилетает еще одна четверка?


Спасибо! 

 

По логике, нет, так не должно работать.
TrimExcess же сокращает капасити, до фактического числа элементов.
И должно получится четыре элемента.

Тут не видно как обрабатывается meQ.m_array[], проверьте на лишнюю итерацию, в самой библиотеке.  
Хотя если капасити уменьшили, а итераций больше, вообще должна вылетать ошибка выход за пределы границ массива ))
Странно в общем.

 
Roman:

По логике, нет, так не должно работать.
TrimExcess же сокращает капасити, до фактического числа элементов.
И должно получится четыре элемента.

Тут не видно как обрабатывается meQ.m_array[], проверьте на лишнюю итерацию, в самой библиотеке.  
Хотя если капасити уменьшили, а итераций больше, вообще должна вылетать ошибка выход за пределы границ массива ))
Странно в общем.

Нет времени сравнивать с реализацией типа данных Очередь на других языках.

Мне нужен был объект сдвигающий влево массив целых чисел в момент постановки нового числа в его край. Думал, что очередь мне пригодится. Похоже, что MQL тут намутил. Было бы неплохо от них какую-то обратную связь услышать, хотя этот колхоз...

class CMyPseudoQueue
  {
public:
   int               meArray[];
   void              CMyPseudoQueue::CMyPseudoQueue(int inSize);
   void              CMyPseudoQueue::doPush(int inValue);

  };

void CMyPseudoQueue::CMyPseudoQueue(int inSizeLimit)
  {
   ArrayResize(meArray,inSizeLimit);
   ArrayInitialize(meArray,0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CMyPseudoQueue::doPush(int inValue)
  {
   int lSize;
   lSize = ArraySize(meArray);
   
   if(lSize == 1)
     {
      meArray[0]=inValue;
      return;
     }

   int lArray[];
   int lCopied;
   lCopied = ArrayCopy(lArray,meArray,0,1,lSize-1);
   ArrayResize(lArray,lSize);
   lArray[lSize-1]=inValue;
   lCopied = ArrayCopy(meArray,lArray,0,0,WHOLE_ARRAY);
   
  }

а так, если кто-то сможет предложить вариант лучше или оптимизировать мой код - буду признателен

 

Да, многие ругались на не качественный порт библиотеки Generic.
Я тут тоже сейчас с очередью мудрю, через ArrayInsert(), по этому обратил внимание на топик.
но ArrayInsert сейчас не работает, обещали поправить.

https://www.mql5.com/ru/forum/350880/page16#comment_18385889

Новая версия платформы MetaTrader 5 build 2615: Фундаментальный анализ и комплексный критерий в тестере стратегий
Новая версия платформы MetaTrader 5 build 2615: Фундаментальный анализ и комплексный критерий в тестере стратегий
  • 2020.09.21
  • www.mql5.com
В четверг 17 сентября 2020 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Nikolai Karetnikov:

а так, если кто-то сможет предложить вариант лучше или оптимизировать мой код - буду признателен

Вариант очереди на Си и на С++ с ООП

https://prog-cpp.ru/data-queue/

Очередь
Очередь
  • 2018.12.14
  • Елена Вставская
  • prog-cpp.ru
называется упорядоченный набор элементов, которые могут удаляться с её начала и помещаться в её конец. Очередь организована, в отличие от стека, согласно дисциплине обслуживания FIFO: Очередь в программировании используется, как и в реальной жизни, когда нужно совершить какие-то действия в порядке их поступления, выполнив их последовательно...
 
template<typename T>
void CQueue::TrimExcess(void)
  {
//--- calculate threshold value
   int threshold=(int)(((double)ArraySize(m_array))*0.9);
//--- set a сapacity equal to the size
   if(m_size<threshold)
      SetCapacity(m_size);
  }

??? Это к вопросу о реализации. Может, конечно, я чего-то не догоняю?)))

ИМХО, конечно, но:

   if(m_size<ArraySize(m_array))
      SetCapacity(m_size);
 
Vladimir Simakov:

??? Это к вопросу о реализации. Может, конечно, я чего-то не догоняю?)))

ИМХО, конечно, но:

Интересно, что автор библиотеки вложил в понятие 0.9  ))

Причина обращения: