Caractéristiques du langage mql5, subtilités et techniques - page 47

 
Mikola_2:

Comme celui-là ?

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

La question portait sur un tableau de structures et le tri par champs de structure.

 
Artyom Trishkin:

Quelqu'un a-t-il réalisé un tri efficace en termes de ressources d'un tableau de structures par n'importe quel champ (pas une chaîne) de la structure ?

Supposons qu'il existe une structure avec trois champs int, datetime et double, et qu'il existe un tableau rempli de données constitué de cette structure. Dans chaque cellule du tableau, les champs de la structure sont remplis.

Comment trier ce tableau par l'un de ces champs ?

Vous créez le tableau double[][2], le remplissez comme { fieldvalue, arrayindex }. Trier par ArraySort régulier (par la première modification). Ensuite, vous organisez les structures dans le tableau en fonction des index. Je pense que c'est le moyen le plus rapide parmi tous les moyens possibles dans MQL.
 
Alexey Navoykov:
Créer un tableau double[][2], le remplir comme { fieldvalue, arrayindex }. Trier par ArraySort régulier (par la première modification). Ensuite, vous devez organiser les structures dans le tableau en fonction des index.
Je voulais contourner cette méthode. Je me suis dit qu'il y avait peut-être d'autres moyens.
 
Artyom Trishkin:
Je voulais contourner cette méthode. Je me suis dit qu'il y avait peut-être d'autres moyens.

Pourquoi le contourner ? Il n'y a rien de plus rapide, car le tri est effectué par une fonction native.

 
Alexey Navoykov:

Pourquoi le contourner ? Il n'y a rien de plus rapide, car c'est une fonction native qui effectue le tri.

En fait, j'ai commencé tout de suite. Je me suis dit que quelqu'un avait peut-être inventé un moyen agréable de trier un tableau de structures par n'importe quel champ.
 
Artyom Trishkin:

Quelqu'un a-t-il réalisé un tri efficace en termes de ressources d'un tableau de structures par n'importe quel champ (pas une chaîne) de la structure ?

Supposons qu'il existe une structure avec trois champs int, datetime et double, et qu'il existe un tableau rempli de données constitué de cette structure. Dans chaque cellule du tableau, les champs de la structure sont remplis.

Comment trier ce tableau par l'un de ces champs ?

Bonjour, si vous avez besoin d'une sorte de fonction de tri universelle qui puisse trier un tableau de type de données complexe, c'est impossible en principe.

Si vous avez besoin de la capacité de tri multifactoriel d'un type connu, vous pouvez le faire en utilisant des classes, et en particulier CArrayObj est conçu pour cela.

Je dois ajouter que même dans les langages pour adultes comme C#, le tri des objets complexes est résolu par un IComparer personnalisé. C'est-à-dire que vous devrez tout de même écrire vous-même un critère de tri.

 
Artyom Trishkin:
C'est la méthode que je voulais contourner. Je pensais qu'il y avait d'autres moyens.

Il y a deux façons de procéder.

Le moyen numéro un est de mettre l'opérateur <

La deuxième voie est celle des fonctionnaires.

 

Méthode numéro un :

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);
}
 

La méthode numéro deux est similaire, sauf que l'opérateur est complètement externe et qu'il passe au tri. C'est un peu plus compliqué, mais beaucoup plus polyvalent.

Si vous en avez besoin, je peux vous donner quelques idées, mais seulement plus tard.

Le tri est juste un copier-coller de kodobase, si vous avez besoin d'être plus rapide, vous devrez écrire votre propre tri intelligent, mais vous n'aurez à l'écrire qu'une seule fois et vous ne vous en soucierez plus.
 
Combinateur:

La méthode numéro deux est similaire, sauf que l'opérateur est complètement externe et qu'il passe au tri. C'est un peu plus compliqué mais beaucoup plus polyvalent.


C'est-à-dire que vous devez utiliser des pointeurs vers des fonctions

Raison: