Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 47

 
Mikola_2:

Wie dieses hier?

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

Die Frage bezog sich auf ein Array von Strukturen und die Sortierung nach Strukturfeldern.

 
Artyom Trishkin:

Hat jemand eine ressourceneffiziente Sortierung eines Arrays von Strukturen nach jedem (nicht String) gegebenen Feld der Struktur getan?

Angenommen, es gibt eine Struktur mit den drei Feldern int, datetime und double, und es gibt ein Array, das mit Daten gefüllt ist, die aus dieser Struktur bestehen. In jeder Zelle des Arrays werden die Felder der Struktur ausgefüllt.

Wie kann man dieses Array nach einem dieser Felder sortieren?

Sie erstellen das Array double[][2] und füllen es mit { fieldvalue, arrayindex }. Sortieren durch reguläres ArraySort (nach erster Änderung). Und dann ordnen Sie die Strukturen im Array nach Indizes an. Ich glaube, dass dies der schnellste Weg von allen möglichen Wegen in MQL ist.
 
Alexey Navoykov:
Erstellen Sie das Array double[][2] und füllen Sie es wie { fieldvalue, arrayindex }. Sortieren mit dem Standard ArraySort (nach der ersten Änderung). Und dann müssen Sie die Strukturen im Array entsprechend den Indizes anordnen.
Ich wollte diese Methode umgehen. Ich dachte, vielleicht gibt es andere Wege.
 
Artyom Trishkin:
Ich wollte diese Methode umgehen. Ich dachte, vielleicht gibt es noch andere Möglichkeiten.

Warum sollte man sie umgehen? Schneller geht es nicht, denn die Sortierung erfolgt über eine eigene Funktion.

 
Alexey Navoykov:

Warum sollte man sie umgehen? Schneller geht es nicht, da es sich um eine systemeigene Funktion handelt, die die Sortierung vornimmt.

Eigentlich habe ich sofort damit angefangen. Ich dachte, vielleicht hat jemand eine gute Methode erfunden , um eine Reihe von Strukturen nach einem beliebigen Feld zu sortieren.
 
Artyom Trishkin:

Hat jemand eine ressourceneffiziente Sortierung eines Arrays von Strukturen nach jedem (nicht String) gegebenen Feld der Struktur getan?

Angenommen, es gibt eine Struktur mit den drei Feldern int, datetime und double, und es gibt ein Array, das mit Daten gefüllt ist, die aus dieser Struktur bestehen. In jeder Zelle des Arrays werden die Felder der Struktur ausgefüllt.

Wie kann man dieses Array nach einem dieser Felder sortieren?

Hallo, wenn Sie eine Art universelle Sortierfunktion benötigen, die ein Array mit komplexen Datentypen sortieren kann, ist das im Prinzip unmöglich.

Wenn Sie die Fähigkeit der Multifaktor-Sortierung eines bekannten Typs benötigen, können Sie es mit Klassen tun, und insbesondere CArrayObj ist für sie konzipiert.

Ich sollte hinzufügen, dass auch in erwachsenen Sprachen wie C# komplexe Objekte Sortierung über benutzerdefinierte IComparer gelöst ist. D.h. Sie müssen trotzdem selbst ein Sortierkriterium schreiben.

 
Artyom Trishkin:
Dies ist die Methode, die ich umgehen wollte. Ich dachte, es gäbe vielleicht andere Möglichkeiten.

Es gibt zwei Möglichkeiten.

Die erste Möglichkeit besteht darin, den Operator <

Weg Nummer zwei sind die Funktionäre.

 

Methode Nummer eins:

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

Methode Nummer zwei ist ähnlich, nur ist der Operator komplett extern und wird an die Sortierung übergeben. Es ist ein bisschen komplizierter, aber vielseitiger.

Wenn Sie möchten, kann ich Ihnen einige Ideen geben, aber erst später.

Sortieren einfach kopieren einige kodobase, wenn Sie schneller brauchen, müssen Sie Ihre eigene intelligente zu schreiben, aber Sie müssen nur es einmal zu schreiben und nicht mehr stören.
 
Kombinator:

Methode Nummer zwei ist ähnlich, nur ist der Operator komplett extern und wird an die Sortierung übergeben. Es ist ein bisschen komplizierter, aber viel vielseitiger.


Das heißt, Sie müssen Zeiger auf Funktionen verwenden

Grund der Beschwerde: