Características da linguagem mql5, subtilezas e técnicas - página 47

 
Mikola_2:

Como este aqui?

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

A questão era sobre um conjunto de estruturas e a ordenação por campos de estrutura.

 
Artyom Trishkin:

Alguém fez uma ordenação eficiente de um conjunto de estruturas por algum (e não cordel) campo dado da estrutura?

Suponha que haja uma estrutura com três campos int, datetime e double, e que haja uma matriz preenchida com dados que consistem nesta estrutura. Em cada célula da matriz, os campos da estrutura são povoados.

Como ordenar esta matriz por qualquer um destes campos?

Você cria array double[][2], preencha-o como { fielddvalue, arrayindex }. Ordenar por ArraySort (pela primeira alteração). E então você organiza as estruturas na matriz de acordo com os índices. Eu acredito que esta é a maneira mais rápida de todas as maneiras possíveis na MQL.
 
Alexey Navoykov:
Crie array double[][2], preencha-o como { fielddvalue, arrayindex }. Ordenar por padrão ArraySortar (pela primeira alteração). E então você precisa organizar as estruturas na matriz de acordo com os índices.
Eu queria contornar este método. Eu pensei, talvez haja outras maneiras.
 
Artyom Trishkin:
Eu queria contornar este método. Eu pensei, talvez haja outras maneiras.

Porquê ignorá-lo? Não se pode pensar em nada mais rápido, porque a triagem é feita por uma função nativa.

 
Alexey Navoykov:

Porquê ignorá-lo? Não se pode pensar em nada mais rápido, pois é uma função nativa que faz a triagem.

Na verdade, eu comecei logo com isso. Eu pensei, talvez alguém tenha inventado uma boa maneira de ordenar uma série de estruturas por qualquer campo.
 
Artyom Trishkin:

Alguém fez uma ordenação eficiente de um conjunto de estruturas por algum (e não cordel) campo dado da estrutura?

Suponha que haja uma estrutura com três campos int, datetime e double, e que haja uma matriz preenchida com dados que consistem nesta estrutura. Em cada célula da matriz, os campos da estrutura são povoados.

Como ordenar esta matriz por qualquer um destes campos?

Olá, se você precisa de algum tipo de função de classificação universal que possa classificar um conjunto de tipos de dados complexos, isso é impossível, em princípio.

Se você precisar de capacidade de classificação de múltiplos fatores de um tipo conhecido, você pode fazê-lo usando classes, e em particular o CArrayObj é projetado para isso.

Devo acrescentar que mesmo em idiomas tão maduros como C# a ordenação de objetos complexos é resolvida usando o IComparer personalizado. Ou seja, você mesmo terá que escrever um critério de classificação.

 
Artyom Trishkin:
Este é o método que eu queria contornar. Pensei que talvez houvesse outras formas.

Há duas maneiras.

A maneira número um é definir o operador <

O modo número dois são os funcionários.

 

Método número um:

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

O método número dois é semelhante, apenas o operador é completamente externo e é passado para a ordenação. É um pouco mais complicado, mas muito mais versátil.

Se precisares, posso dar-te algumas ideias, mas só mais tarde.

Escolhendo apenas copypaste algum kodobase, se você precisar de mais rápido, você terá que escrever o seu próprio kodobase inteligente, mas você só tem que escrevê-lo uma vez e não se incomode mais.
 
Combinador:

O método número dois é semelhante, apenas o operador é completamente externo e é passado para a ordenação. É um pouco mais complicado, mas muito mais versátil.


Ou seja - você tem que usar apontadores para funções

Razão: