일반 클래스 라이브러리 - 버그, 설명, 질문, 사용 기능 및 제안 사항 - 페이지 22

 
알렉세이 나보이코프 :

분명히 상속이 아니라 구조에 대한 클래스의 래퍼를 의미합니까?

글쎄요.
 
//+------------------------------------------------------------------+
//| Determines whether a set contains the specified element.         |
//+------------------------------------------------------------------+
template < typename T>
bool CHashSet::Contains(T item)
  {
//--- check buckets
   if ( ArraySize (m_buckets)!= 0 )
     {
       //--- get hash code for item      
       int hash_code=m_comparer.HashCode(item) & 0x7FFFFFFF ;
       //--- search item in the slots       
       for ( int i=m_buckets[hash_code% ArraySize (m_buckets)]- 1 ; i>= 0 ; i=m_slots[i].next)
         if (m_slots[i].hash_code==hash_code && m_comparer.Equals(m_slots[i].value,item))
             return ( true );
     }
   return ( false );
  }

부호 비트가 잘리는 이유는 무엇입니까?

 
fxsaber :

부호 비트가 잘리는 이유는 무엇입니까?

해시는 배열의 인덱스 역할을 하기 때문에 양수여야 합니다.

 
더엑스퍼트 :

해시는 배열의 인덱스 역할을 하기 때문에 양수여야 합니다.

단위?

 
fxsaber :

단위?

그것은 말도 안돼

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 
더엑스퍼트 :

그것은 말도 안돼

선택한 라인의 조합이 잘못된 것 같습니다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

일반 클래스 라이브러리 - 버그, 설명, 질문, 사용법 및 제안

fxsaber , 2018.06.11 20:04

 //+------------------------------------------------------------------+
//| Determines whether a set contains the specified element.         |
//+------------------------------------------------------------------+
template < typename T>
bool CHashSet::Contains(T item)
  {
//--- check buckets
   if ( ArraySize (m_buckets)!= 0 )
     {
       //--- get hash code for item      
       int hash_code=m_comparer.HashCode(item) & 0x7FFFFFFF ;
       //--- search item in the slots       
       for ( int i=m_buckets[hash_code% ArraySize (m_buckets)]- 1 ; i>= 0 ; i=m_slots[i].next)
         if ( m_slots[i].hash_code==hash_code && m_comparer.Equals(m_slots[i].value,item))
             return ( true );
     }
   return ( false );
  }

잘린 해시와 잘리지 않은 해시를 어떻게 비교할 수 있습니까?

 
fxsaber :

잘린 해시와 잘리지 않은 해시를 어떻게 비교할 수 있습니까?

모두 포경수술을 한 것 같은데, 제가 코드를 간략하게, 그리고 길게 봐서 틀릴 수 있음을 바로 말씀드립니다.

요소를 추가하는 코드를 참조하십시오

 
더엑스퍼트 :

모두 포경수술을 한 것 같은데, 제가 코드를 간략하게, 그리고 길게 봐서 틀릴 수 있음을 바로 말씀드립니다.

요소를 추가하는 코드를 참조하십시오

 //+------------------------------------------------------------------+
//| Insert the value with the specified key from the map.            |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
bool CHashMap::Insert(TKey key,TValue value , const bool add)
  {
   if (m_capacity== 0 )
      Initialize( 0 );
//--- get hash code from key
   int hash_code=m_comparer.HashCode(key)& 0x7FFFFFFF ;
   int target_bucket=hash_code%m_capacity;
//--- collisions count in one bucket with different hashes
   int collision_count= 0 ;
//--- search pair with specified key
   for ( int i=m_buckets[target_bucket]; i>= 0 ; i=m_entries[i].next)
     {
       //--- hash compare      
       if (m_entries[i].hash_code!=hash_code)
        {
         collision_count++;
         continue ;
        }
       //--- value compare     
       if (m_comparer.Equals(m_entries[i].key,key))
        {
         //--- adding duplicate
         if (add)
             return ( false );
         m_entries[i]. value = value ;
         return ( true );
        }
     }
//--- check collision
   if (collision_count>=m_collision_threshold)
     {
       int new_size=CPrimeGenerator::ExpandPrime(m_count);
      Resize(new_size);
     }
//--- calculate index
   int index;
   if (m_free_count> 0 )
     {
      index=m_free_list;
      m_free_list=m_entries[index].next;
      m_free_count--;
     }
   else
     {
       if (m_count==ArraySize(m_entries))
        {
         int new_size=CPrimeGenerator::ExpandPrime(m_count);
         Resize(new_size);
         target_bucket=hash_code%new_size;
        }
      index=m_count;
      m_count++;
     }
//--- set pair
   m_entries[index].hash_code=hash_code;
   m_entries[index].next=m_buckets[target_bucket];
   m_entries[index].key=key;
   m_entries[index]. value = value ;
   m_buckets[target_bucket]=index;
   return ( true );
  }

예, 감사합니다. 할례를 받지 않은 코드는 없습니다. HashCode 메서드 자체에 컷이 없는 것이 이상합니다. 분명히 계산은 바보(곡선 사용자 정의 해시)로부터 보호하기 위한 것이었습니다.

 

이미 있었다면 죄송합니다. 문서에서 찾지 못했습니다.

세트에 루프가 있습니까? 반복자?

 
빅토르 루비모프 :

이미 있었다면 죄송합니다. 문서에서 찾지 못했습니다.

세트에 루프가 있습니까? 반복자?

불행하게도.
그러나 직접 구현할 수 있습니다.
예를 들어 여기에서 MQL5 RECIPES - WE IMPLEMENT AN ASSOCIATE ARRAY OR DICTIONARY FOR QUICK ACCESS TO DATA 기사의 예를 볼 수 있습니다.

 void ReverseEnumerateAll(CList& list)
{
   CObject* node = list.GetLastNode();
   for ( int i = list.Total()- 1 ; node != NULL ; i--, node = node.Prev())
       printf ( "Element at " + ( string )i); 
}
Как работает этот код? На самом деле все просто. В функции EnumerateAll() в самом начале мы получаем ссылку на первый узел. Затем в цикле for мы печатаем порядковый узел этого узла 
и переходим к следующему узлу командой node = node.Next(), не забывая при этом проитерировать текущий индекс элемента на единицу (i++). Перебор продолжается до тех пор, пока текущий 
узел node не станет равен NULL , за это ответствен код во втором блоке for : node != NULL .

Аналогично работает реверсивная версия этой функции ReverseEnumerateAll() с той лишь разницей, что она вначале получает последний элемент списка CObject* node = list.GetLastNode(). 
В цикле for она получает не следующий, а предыдущий элемент списка node = node.Prev().