mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 47

 
미콜라_2 :

이 같은?

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

질문은 구조의 배열과 구조의 필드별로 정렬하는 것이었습니다.

 
Artyom Trishkin :

누구든지 (문자열이 아닌) 주어진 구조 필드로 구조 배열을 저렴하게 정렬한 적이 있습니까?

int, datetime 및 double 3개의 필드가 있는 구조가 있고 이 구조로 구성된 데이터로 채워진 배열이 있다고 가정해 보겠습니다. 배열의 각 셀에서 구조의 필드가 채워집니다.

이 필드를 기준으로 이 배열을 정렬하는 방법은 무엇입니까?

double[][2] 배열을 만들고 { fieldvalue, arrayindex }로 채웁니다. 일반 ArraySort로 정렬합니다(첫 번째 변경 기준). 그러면 이미 인덱스에 따라 배열의 구조를 정렬합니다. MQL에서 가능한 모든 방법 중 가장 빠른 방법이라고 생각합니다.
 
알렉세이 나보이코프 :
double[][2] 배열을 만들고 { fieldvalue, arrayindex }로 채웁니다. 일반 ArraySort로 정렬합니다(첫 번째 변경 기준). 그러면 이미 인덱스에 따라 배열의 구조를 정렬합니다.
나는 단지 이 방법을 우회하고 싶었다. 다른 방법이 있을 수 있다고 생각했습니다.
 
Artyom Trishkin :
나는 단지 이 방법을 우회하고 싶었다. 다른 방법이 있을 수 있다고 생각했습니다.

왜 그것을 우회합니까? 당신은 더 빨리 아무것도 생각해낼 수 없습니다, 왜냐하면 정렬은 기본 함수에 의해 수행됩니다.

 
알렉세이 나보이코프 :

왜 그것을 우회합니까? 당신은 더 빨리 아무것도 생각해낼 수 없습니다, 왜냐하면 정렬은 기본 함수에 의해 수행됩니다.

원칙적으로 이것으로 즉시 시작했습니다. 갑자기 누군가가 필드별로 구조 배열을 정렬하는 아름다운 방법을 생각해 냈습니다.
 
Artyom Trishkin :

누구든지 (문자열이 아닌) 주어진 구조 필드로 구조 배열을 저렴하게 정렬한 적이 있습니까?

int, datetime 및 double 3개의 필드가 있는 구조가 있고 이 구조로 구성된 데이터로 채워진 배열이 있다고 가정해 보겠습니다. 배열의 각 셀에서 구조 필드가 채워집니다.

이 필드를 기준으로 이 배열을 정렬하는 방법은 무엇입니까?

안녕하세요, 복잡한 데이터 유형의 배열을 정렬할 수 있는 일종의 범용 정렬 기능이 필요한 경우 원칙적으로 불가능합니다.

이전에 알려진 유형의 다중 요소 정렬 가능성이 필요한 경우 클래스를 통해 표준 수단으로 수행할 수 있으며 특히 CArrayObj가 이를 위해 설계되었습니다.

C#과 같은 성인용 언어에서도 복잡한 개체의 정렬은 사용자 지정 IComparer를 통해 해결된다고 덧붙입니다. 저것들. 여전히 정렬 기준을 직접 작성해야 합니다.

 
Artyom Trishkin :
나는 단지 이 방법을 우회하고 싶었다. 다른 방법이 있을 수 있다고 생각했습니다.

예, 두 가지가 있습니다.

방법 번호 1 - 연산자 지정 <

두 번째 방법은 펑터입니다.

 

첫 번째 방법:

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

방법 번호 2는 유사하지만 연산자만 완전히 외부적이며 정렬에 전달됩니다. 조금 더 복잡하지만 훨씬 더 다양합니다.

필요한 경우 던질 수 있지만 나중에 만 가능합니다.

정렬은 일부 코드 기반의 복사-붙여넣기일 뿐입니다. 더 빨리 필요하면 자신만의 스마트한 코드를 작성해야 하지만 한 번만 작성하면 더 이상 걱정할 필요가 없습니다.
 
결합기 :

방법 번호 2는 유사하지만 연산자만 완전히 외부적이며 정렬에 전달됩니다. 조금 더 복잡하지만 훨씬 더 다양합니다.


즉 - 함수 포인터 를 사용해야 합니다.