Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 47

 
Mikola_2 :

Bunun gibi?

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

Soru, bir dizi yapı ve yapı alanlarına göre sıralama hakkındaydı.

 
Artyom Trishkin :

Herhangi bir (string olmayan) verilen yapı alanına göre bir dizi yapıyı ucuz bir şekilde sıralayan var mı?

Diyelim ki int, datetime ve double alanları olan bir yapı var ve bu yapıdan oluşan verilerle dolu bir dizi var. Dizinin her hücresinde yapının alanları doldurulur.

Bu dizi, bu alanlardan herhangi birine göre nasıl sıralanır?

Bir double[][2] dizisi oluşturun, onu { fieldvalue, arrayindex } olarak doldurun. Normal ArraySort ile sıralayın (ilk değişikliğe göre). O zaman dizideki yapıları zaten indekslere göre düzenlersiniz. Bunun MQL'deki tüm olası yolların en hızlısı olduğuna inanıyorum.
 
Alexey Navoykov :
Bir double[][2] dizisi oluşturun, onu { fieldvalue, arrayindex } olarak doldurun. Normal ArraySort'a göre sıralayın (ilk değişikliğe göre). O zaman dizideki yapıları zaten indekslere göre düzenlersiniz.
Ben sadece bu yöntemi atlamak istedim. Başka yollar olabileceğini düşündüm.
 
Artyom Trishkin :
Ben sadece bu yöntemi atlamak istedim. Başka yollar olabileceğini düşündüm.

Neden bunu atlasın? Daha hızlı bir şey bulamazsınız, çünkü sıralama, yerel bir işlev tarafından gerçekleştirilir.

 
Alexey Navoykov :

Neden bunu atlasın? Daha hızlı bir şey bulamazsınız, çünkü sıralama, yerel bir işlev tarafından gerçekleştirilir.

Prensip olarak ve hemen bununla başladı. Birdenbire birinin bir dizi yapıyı herhangi bir alana göre sıralamanın güzel bir yolunu bulduğunu düşündüm.
 
Artyom Trishkin :

Herhangi bir (string olmayan) verilen yapı alanına göre bir dizi yapıyı ucuz bir şekilde sıralayan var mı?

Diyelim ki int, datetime ve double alanları olan bir yapı var ve bu yapıdan oluşan verilerle dolu bir dizi var. Dizinin her hücresinde yapı alanları doldurulur.

Bu dizi, bu alanlardan herhangi birine göre nasıl sıralanır?

Merhaba, karmaşık bir veri türü dizisini sıralayabilen bir tür evrensel sıralama işlevine ihtiyacınız varsa, bu prensipte imkansızdır.

Önceden bilinen bir türde çok faktörlü sıralama olanağına ihtiyacınız varsa, bu, sınıflar aracılığıyla standart yollarla yapılabilir ve özellikle CArrayObj bunun için tasarlanmıştır.

C# gibi yetişkin dillerinde bile karmaşık nesnelerin sıralanması özel IComparer aracılığıyla çözüldüğünü ekleyeceğim. Onlar. Yine de sıralama kriterini kendiniz yazmanız gerekiyor.

 
Artyom Trishkin :
Ben sadece bu yöntemi atlamak istedim. Başka yollar olabileceğini düşündüm.

Evet iki tane var.

Bir numaralı yöntem - operatörün belirtilmesi <

İkinci yöntem, işlevlerdir.

 

Bir numaralı yöntem:

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

İkinci yöntem benzerdir, yalnızca operatör tamamen haricidir ve sıralamaya iletilir. Biraz daha karmaşık ama çok daha çok yönlü.

Gerekirse atabilirim, ancak daha sonra.

Sıralama sadece bir kod tabanının kopyala-yapıştır işlemidir, daha hızlı ihtiyacınız varsa, kendi akıllı olanı yazmanız gerekir, ancak bir kez yazın ve artık endişelenmeyin.
 
birleştirici :

İkinci yöntem benzerdir, yalnızca operatör tamamen haricidir ve sıralamaya iletilir. Biraz daha karmaşık ama çok daha çok yönlü.


Yani - işlev işaretçilerini kullanmanız gerekir