Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 47

 
Mikola_2:

Come questo?

https://www.mql5.com/ru/code/9336

La domanda riguardava un array di strutture e l'ordinamento per campi di strutture.

 
Artyom Trishkin:

Qualcuno ha fatto un ordinamento efficiente in termini di risorse di un array di strutture per qualsiasi campo (non stringa) dato della struttura?

Supponiamo che ci sia una struttura con tre campi int, datetime e double, e che ci sia un array riempito di dati che consiste in questa struttura. In ogni cella della matrice, i campi della struttura sono popolati.

Come ordinare questo array per uno qualsiasi di questi campi?

Si crea l'array double[][2], lo si riempie come { fieldvalue, arrayindex }. Ordina per ArraySort regolare (per prima modifica). E poi si dispongono le strutture nell'array secondo gli indici. Credo che questo sia il modo più veloce di tutti i modi possibili in MQL.
 
Alexey Navoykov:
Creare array double[][2], riempirlo come { fieldvalue, arrayindex }. Ordina per ArraySort regolare (per prima modifica). E poi dovete disporre le strutture nell'array secondo gli indici.
Volevo bypassare questo metodo. Ho pensato che forse ci sono altri modi.
 
Artyom Trishkin:
Volevo bypassare questo metodo. Ho pensato che forse ci sono altri modi.

Perché bypassarlo? Non si può pensare a qualcosa di più veloce, perché l'ordinamento è fatto da una funzione nativa.

 
Alexey Navoykov:

Perché bypassarlo? Non si può pensare a qualcosa di più veloce, dato che è una funzione nativa che fa l'ordinamento.

In realtà, ho iniziato subito con questo. Ho pensato che forse qualcuno ha inventato un bel modo per ordinare un array di strutture per qualsiasi campo.
 
Artyom Trishkin:

Qualcuno ha fatto un ordinamento efficiente in termini di risorse di un array di strutture per qualsiasi campo (non stringa) dato della struttura?

Supponiamo che ci sia una struttura con tre campi int, datetime e double, e che ci sia un array riempito di dati che consiste in questa struttura. In ogni cella della matrice, i campi della struttura sono popolati.

Come ordinare questo array per uno qualsiasi di questi campi?

Ciao, se hai bisogno di una sorta di funzione di ordinamento universale che possa ordinare un array di tipo di dati complesso, questo è impossibile in linea di principio.

Se avete bisogno di capacità di ordinamento multifattoriale di un tipo noto, potete farlo usando le classi, e in particolare CArrayObj è progettato per questo.

Dovrei aggiungere che anche in linguaggi adulti come C# l'ordinamento degli oggetti complessi è risolto tramite IComparer personalizzato. Cioè dovrete scrivere voi stessi un criterio di ordinamento.

 
Artyom Trishkin:
Questo è il metodo che volevo aggirare. Ho pensato che potrebbero esserci altri modi.

Ci sono due modi.

Il modo numero uno è impostare l'operatore <

La via numero due sono i funzionari.

 

Metodo numero uno:

template <typename t>
void Sort(t& a[], bool ascending = true)
{
  if (ascending) SortShellUp(a);
  else           SortShellDn(a);
}

template <typename t>
void SortShellUp(t& a[])
{
  t tmp;
  int n[]={9,5,3,2,1};
  int i,j,k,g;
  int Len=ArraySize(a);
  for(k=0;k<5;k++)
  {
    g=n[k];
    for(i=g;i<Len;i++)
    {
      tmp=a[i];
      for(j=i-g;j>=0 && tmp<a[j];j-=g)
      {
        a[j+g]=a[j];
      }
      a[j+g]=tmp;
    }
  }
}

template <typename t>
void SortShellDn(t& a[])
{
  t tmp;
  int n[]={9,5,3,2,1};
  int i,j,k,g;
  int Len=ArraySize(a);
  for(k=0;k<5;k++)
  {
    g=n[k];
    for(i=g;i<Len;i++)
    {
      tmp=a[i];
      for(j=i-g;j>=0 && a[j]<tmp;j-=g)
      {
        a[j+g]=a[j];
      }
      a[j+g]=tmp;
    }
  }
}

struct DrawData
{
   float price;
   float percent;
   
   bool operator < (const DrawData& right) const
   {
      return price < right.price;
   }
};

{
   DrawData items[];
   // filling
   Sort(items);
}
 

Il metodo numero due è simile, solo che l'operatore è completamente esterno e viene passato all'ordinamento. È un po' più complicato, ma molto più versatile.

Se hai bisogno, posso darti qualche idea, ma solo dopo.

L'ordinamento si limita a copiare un po' di kodobase, se avete bisogno di una maggiore velocità, dovrete scriverne uno intelligente, ma basta scriverlo una volta e non preoccupatevi più.
 
Combinatore:

Il metodo numero due è simile, solo che l'operatore è completamente esterno e viene passato all'ordinamento. È un po' più complicato ma molto più versatile.


Cioè - dovete usare puntatori a funzioni

Motivazione: