Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 22

 
Alexey Navoykov :

Görünüşe göre kalıtım değil, bir sınıftan bir yapı üzerindeki bir sarmalayıcı mı demek istiyorsun?

iyi evet.
 
//+------------------------------------------------------------------+
//| 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 );
  }

İşaret biti neden kesildi?

 
fxsaber :

İşaret biti neden kesildi?

hash pozitif olmalıdır çünkü bir dizide indeks görevi görür

 
TheXpert :

hash pozitif olmalıdır çünkü bir dizide indeks görevi görür

uint?

 
fxsaber :

uint?

hiç bir anlamı yok

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

hiç bir anlamı yok

Seçilen satırların kombinasyonu hatalı görünüyor

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Genel sınıf kitaplığı - hatalar, açıklama, sorular, kullanım ve öneriler

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

Kesik bir hash ile kesilmemiş bir hash'i nasıl karşılaştırabilirsiniz?

 
fxsaber :

Kesik bir hash ile kesilmemiş bir hash'i nasıl karşılaştırabilirsiniz?

Sanırım hepsi sünnetli ama hemen belirteyim ki ben sadece kısa ve uzun bir süre koda baktım, yanılıyor da olabilirim.

eleman ekleme koduna bakın

 
TheXpert :

Sanırım hepsi sünnetli ama hemen belirteyim ki ben sadece kısa ve uzun bir süre koda baktım, yanılıyor da olabilirim.

eleman ekleme koduna bakın

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

Evet, teşekkürler, sünnetsiz kod yoktur. HashCode yönteminin kendisinde bir kesinti olmaması garip. Görünüşe göre, hesaplama bir aptaldan korunmak içindi (eğri özel karmalar).

 

Daha önce olduysa özür dilerim. Belgelerde bulamadım.

Setlerde döngü var mı? yineleyici?

 
Viktor Lubimov'un fotoğrafı.

Daha önce olduysa özür dilerim. Belgelerde bulamadım.

Setlerde döngü var mı? yineleyici?

Ne yazık ki hayır.
Ancak bunu kendiniz uygulayabilirsiniz.
Burada, örneğin, MQL5 TARİFLERİ - VERİLERE HIZLI ERİŞİM İÇİN BİR İLİŞKİN DİZİ VEYA SÖZLÜK UYGULAMASI makalesinden bir örnek görebilirsiniz.

 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().