Características del lenguaje mql5, sutilezas y técnicas - página 47

 
Mikola_2:

¿Como éste?

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

La pregunta era sobre un array de estructuras y la ordenación por campos de estructura.

 
Artyom Trishkin:

¿Ha hecho alguien una ordenación eficiente de recursos de un array de estructuras por cualquier campo (no cadena) dado de la estructura?

Supongamos que hay una estructura con tres campos int, datetime y double, y que hay un array lleno de datos formado por esta estructura. En cada celda del array se rellenan los campos de la estructura.

¿Cómo ordenar esta matriz por cualquiera de estos campos?

Se crea el array double[][2], se rellena como { fieldvalue, arrayindex }. Ordenar por ArraySort regular (por primer cambio). Y luego se organizan las estructuras en el array según los índices. Creo que esta es la forma más rápida de todas las posibles en MQL.
 
Alexey Navoykov:
Crear array double[][2], llenarlo como { fieldvalue, arrayindex }. Ordenar por ArraySort regular (por primer cambio). Y luego hay que ordenar las estructuras en el array según los índices.
Quería evitar este método. Pensé que tal vez había otras maneras.
 
Artyom Trishkin:
Quería evitar este método. Pensé que tal vez había otras maneras.

¿Por qué evitarlo? No hay una forma más rápida de evitarlo, ya que la ordenación se realiza mediante una función nativa.

 
Alexey Navoykov:

¿Por qué evitarlo? No se puede pensar en nada más rápido, ya que es una función nativa que hace la clasificación.

De hecho, empecé con ello enseguida. Pensé que tal vez alguien ha inventado una buena manera de ordenar una matriz de estructuras por cualquier campo.
 
Artyom Trishkin:

¿Ha hecho alguien una ordenación eficiente de recursos de un array de estructuras por cualquier campo (no cadena) dado de la estructura?

Supongamos que hay una estructura con tres campos int, datetime y double, y que hay un array lleno de datos formado por esta estructura. En cada celda del array se rellenan los campos de la estructura.

¿Cómo ordenar esta matriz por cualquiera de estos campos?

Hola, si necesitas algún tipo de función de ordenación universal que pueda ordenar un array de tipo de datos complejo, eso es imposible en principio.

Si necesitas capacidad de ordenación multifactorial de un tipo conocido, puedes hacerlo usando clases, y en particular CArrayObj está diseñado para ello.

Debo añadir que incluso en lenguajes adultos como C# la ordenación de objetos complejos se resuelve mediante IComparer personalizado. Es decir, tendrás que escribir tú mismo un criterio de ordenación.

 
Artyom Trishkin:
Este es el método que quería evitar. Pensé que podría haber otras formas.

Hay dos maneras.

La forma número uno es poner el operador <

La segunda vía son los funcionarios.

 

Método número 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);
}
 

El método número dos es similar, sólo que el operador es completamente externo y se pasa a la ordenación. Es un poco más complicado, pero mucho más versátil.

Si lo necesitas, puedo darte algunas ideas, pero sólo después.

La ordenación solo es un copypaste de kodobase, si necesitas más rápido, tendrás que escribir tu propio inteligente, pero solo tienes que escribirlo una vez y no te molestes más.
 
Combinador:

El método número dos es similar, sólo que el operador es completamente externo y se pasa a la ordenación. Es un poco más complicado pero mucho más versátil.


Es decir, hay que utilizar punteros a funciones

Razón de la queja: