mql5语言的特点、微妙之处以及技巧 - 页 47

 
米科拉_2

像这个?

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

问题是关于一个结构数组和按结构字段排序。

 
阿尔乔姆-特里什金

有没有人按结构中的任何(非字符串)给定字段对结构数组 进行过资源高效的排序

假设有一个带有int、datetime和double三个字段的结构,有一个由这个结构组成的数组充满了数据。在数组的每个单元中,结构的字段被填充。

如何按这些字段中的任何一个对这个数组进行排序?

你创建了数组double[][2],将其填充为{ fieldvalue, arrayindex }。通过常规的ArraySort(按第一次变化)进行排序。然后你根据索引来安排数组中的结构。我相信这是MQL中所有可能的方法中最快的方法。
 
阿列克谢-纳沃伊科夫
创建数组double[][2],像{ fieldvalue, arrayindex }那样填充它。通过常规的ArraySort(按第一次变化)进行排序。然后你需要根据索引来安排数组中的结构。
我想绕过这个方法。我想,也许还有其他方法。
 
阿尔乔姆-特里什金
我想绕过这个方法。我想,也许还有其他方法。

为什么要绕过它?没有更快捷的方法,因为排序是由一个本地函数完成的。

 
阿列克谢-纳沃伊科夫

为什么要绕过它?你想不出有什么比这更快的了,因为它是一个本地函数来进行排序的。

实际上,我马上就开始用了。我想,也许有人已经发明了一种很好的方法 按任何字段 结构数组进行排序
 
阿尔乔姆-特里什金

有没有人按结构中的任何(非字符串)给定字段对结构数组 进行过资源高效的排序

假设有一个带有int、datetime和double三个字段的结构,有一个由这个结构组成的数组充满了数据。在数组的每个单元中,结构的字段被填充。

如何按这些字段中的任何一个对这个数组进行排序?

你好,如果你需要某种通用的排序函数,可以对复杂数据类型的数组进行排序,这在原则上是不可能的。

如果你需要一个已知类型的多因素排序能力,你可以用类来做,特别是CArrayObj就是为它设计的。

我应该补充的是,即使在C#这样的成人语言中,复杂对象的排序也是通过自定义IComparer解决的。也就是说,你将不得不自己写一个排序标准,都是如此。

 
阿尔乔姆-特里什金
这是我想绕过的方法。我想可能还有其他方法。

有两种方法。

第一种方法是设置运算符<

第二条途径是职能部门。

 

方法一。

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

方法二是类似的,只是操作者完全是外部的,并被传递给排序。它有点复杂,但用途更广。

如果你需要,我可以给你一些想法,但只能在以后。

排序只是复制粘贴一些kodobase,如果你需要更快的速度,你必须自己写一个智能的,但你只需要写一次就不用再麻烦了。
 
组合器

方法二是类似的,只是操作者完全是外部的,并被传递给排序。它有点复杂,但用途更广。


就是说--你必须使用 指向函数的 指针