기능 - 구조 배열을 정렬하는 방법입니다. 상금 10$ - 페이지 8

 
Georgiy Merts :

개인적으로 저는 오래전에 CObject에서 상속된 CStructWrapper 클래스를 직접 작성했으며(CMyObject는 사실 추가 디버깅 필드가 있는 동일한 것입니다) 정렬을 위해 표준 함수를 사용합니다.

구조체 배열이 필요한 경우 이 템플릿을 기반으로 하는 후속 클래스도 선언합니다. 그 안에 구조의 필요한 필드를 비교하기 위한 함수를 선언합니다. 그런 다음 - 정렬과 함께 객체 배열의 표준 클래스를 사용합니다.

생성된 개체는 할당 연산자를 사용하여 구조에서 직접 복사할 수 있습니다. 필요한 경우 복사합니다.

불행히도, 나는 아직 당신의 코드를 이해할 만큼 OOP에 강하지 않습니다.

 
Vladimir Pastushak :

불행히도, 나는 아직 당신의 코드를 이해할 만큼 OOP에 강하지 않습니다.

내부에 구조를 포함하는 클래스일 뿐입니다.

그리고 객체와 구조 사이에 직접 대입 기호(=)를 사용할 수 있게 해주는 모든 종류의 복사 연산자.

구조의 배열이 필요할 때 그러한 객체의 배열을 만듭니다. 각각은 필요한 구조를 가지고 있습니다. 또한 이 클래스는 정렬 및 검색에 필요한 비교 기능을 정의합니다. 모든 것, 그러면 CArrayObj 클래스의 표준 기능이 사용됩니다.

 
Vladimir Pastushak :

불행히도, 나는 아직 당신의 코드를 이해할 만큼 OOP에 강하지 않습니다.

OOP 없이 메소드를 잘 구현하십시오. 멀리 가지 않기 위해 SB에서 "빠른 정렬"방법을 사용합니다 (많은 정렬 알고리즘 이 있습니다. 누군가 다른 알고리즘의 시각화와 같은 비디오를 던졌습니다. 어떤 상황에서는 각각이 더 낫지 만 이것이 최적이며 가장 널리 사용됨) 구조에 맞게 변경합니다. 여기에서 어느 정도 비교할 구조의 필드를 선택해야 합니다. 이와 같은 것(일부 라인에 대해 your_value )

 //+------------------------------------------------------------------+
//| Method QuickSort                                                 |
//+------------------------------------------------------------------+
void CArrayString::QuickSort( int beg, int end, const int mode)
  {
   int     i,j;
   string p_string;
   string  YOUR_STRUCT t_string;
//--- check
   if (beg< 0 || end< 0 )
       return ;
//--- sort
   i=beg;
   j=end;
   while (i<end)
     {
       //--- ">>1" is quick division by 2
      p_string=m_data[(beg+end)>> 1 ] .your_value ;
       while (i<j)
        {
         while (m_data[i] .your_value <p_string)
           {
             //--- control the output of the array bounds
             if (i==m_data_total- 1 )
               break ;
            i++;
           }
         while (m_data[j] .your_value >p_string)
           {
             //--- control the output of the array bounds
             if (j== 0 )
               break ;
            j--;
           }
         if (i<=j)
           {
            t_string=m_data[i];
            m_data[i++]=m_data[j];
            m_data[j]=t_string;
             //--- control the output of the array bounds
             if (j== 0 )
               break ;
            j--;
           }
        }
       if (beg<j)
         QuickSort(beg,j);
      beg=i;
      j=end;
     }
  }
 
Vladimir Pastushak :

불행히도, 나는 아직 당신의 코드를 이해할 만큼 OOP에 강하지 않습니다.

그러나 그것을 위해 ***와 ***를 잘 구별할 수 있습니까?

 
Vladimir Pastushak :

불행히도 이제 fxsaber가 제안한 방법조차도 작동을 멈췄습니다.

그리고 구조체 배열 을 정렬하는 방법을 찾고 있습니다. 작업 옵션이 있는 사람이 있습니까?

그런 언어 제한 우회가 가능하다고 생각합니다.

 #property strict

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct( T , ARRAY, FIELD)                                         \
{                                                                                \
   class SORT                                                                     \
  {                                                                              \
   private :                                                                       \
     static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
       const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
     static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
       int Marker = Start;                                                        \
                                                                                 \          
       for ( int i = Start; i <= End; i++)                                         \
         if (Array[i]. ##FIELD <= Array[End]. ##FIELD)                               \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return (Marker - 1 );                                                       \
    }                                                                            \
                                                                                 \
     static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
       if (Start < End)                                                           \
      {                                                                          \
         const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1 );                                \
        SORT::QuickSort(Array, Pivot + 1 , End);                                  \
      }                                                                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
   public :                                                                        \
     static void Sort( T &Array[], int Count = WHOLE_ARRAY , const int Start = 0 ) \
    {                                                                            \
       if (Count == WHOLE_ARRAY )                                                  \
        Count = :: ArraySize (Array);                                              \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1 );                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}

void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
  ArraySortStruct( MqlRates , Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
  ArraySortStruct( MqlRates , Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
  ArraySortStruct( MqlRates , Rates, time);
   ArrayPrint (Rates);
}
 
Dmitry Fedoseev :

그러나 그것을 위해 ***와 ***를 잘 구별할 수 있습니까?

사람들처럼 ... 당신이 나를 누군가와 혼동하는 것 같습니다 ...

 
Vladimir Pastushak :

사람들처럼 ... 당신이 나를 누군가와 혼동하는 것 같습니다 ...

그것은 단지 요점, "보이는" 것입니다. 그러나 나는 혼동하지 않습니다.

 
Dmitry Fedoseev :

그것은 단지 요점, "보이는" 것입니다. 그러나 나는 혼동하지 않습니다.

그리고 이 "강판"은 무엇을 위한 것입니까? 주제와 어떤 관련이 있습니까?

 
Сергей Таболин :

그리고 이 "강판"은 무엇을 위한 것입니까? 주제와 어떤 관련이 있습니까?

그리고 뭐? 이를 위해 별도의 스레드를 시작하시겠습니까?

 
Aleksey Mavrin :

OOP 없이 메소드를 잘 구현하십시오. 멀리 가지 않으려면 SB에서 "빠른 정렬"방식을 취하십시오.

fxsaber :

그런 언어 제한 우회가 가능하다고 생각합니다.

고마워 친구!

그는 그를 자신의 구멍으로 끌고 갔다.