2016-03-30 10 views
0

Ayrı zincirleme kullanarak hashing uygulamaya çalışıyorum. Yalnızca hashmap sınıfı için nesne oluştururken, hashnode yapıcısının nasıl başlatıldığını anlayamıyorum. Her ikisi de birbirilerine özeldir ve ayrıca hashnode'dan hashmap sınıfından türemedim. Peki bu nasıl çalışıyor?Hashhnode kurucusunun nasıl başlatıldığı

#include <iostream> 
using namespace std; 
static const int table_size = 10; 
class hashnode { 
     public: 
      int key; 
      int value; 
      hashnode* next; 

      hashnode(int key, int value) 
      { 
       this->key = key; 
       this->value = value; 
       this->next = NULL; 
      } 

}; 

class hashmap { 
    hashnode** table; 
public: 
    hashmap() 
    { 
     table = new hashnode* [table_size]; 
     for(int i=0;i<table_size;i++) 
     { 
      table[i] = NULL; 
     } 
    } 

    int hash(int key) 
    { 
     return key%table_size; 
    } 

    void insert(int key, int value) 
    { 
     int hash_val = hash(key); 
     hashnode* prev = NULL; 
     hashnode* entry = table[hash_val]; 

     while(entry != NULL) 
     { 
      prev = entry; 
      entry = entry->next; 
     } 

     if(entry == NULL) 
     { 
      entry = new hashnode(key,value); 
      if(prev == NULL) 
      { 
       table[hash_val] = entry; 
      } 
      else 
      { 
       prev->next = entry; 
      } 
     } 
     else 
     { 
      entry->value = value; 
     } 
    } 

    void printtable(int key) 
    { 
     while(table[0] != NULL) 
     { 
      cout<<table[0]->key<<endl; 
      table[0] = table[0]->next; 
     } 
    } 
}; 

int main() 
{ 
hashmap hash1; 
int key,value; 
int choice; 
+1

"dizi" 'hashmap :: table' sabit bir derleme zamanı boyutuna sahipse, neden gerçek bir dizi kullanmıyorsunuz? Ve eğer boyut aslında bir derleme zamanı sabiti değilse, muhtemelen bunun yerine 'std :: vector' kullanılmalıdır. –

+2

@JoachimPileborg Muhtemelen bu şey akademi-odaklı görev yoluyla genişleyecek ve yük faktörü aşıldıktan sonra her şey yeniden şekillendirilecektir. En azından bu yüzden yapardım. (Tamam, bu bir yalan oldu, ben sadece std :: unordered_map <> 'kullanmak istiyorum sadece benim sanırım neredeyse herkes). – WhozCraig

+1

Probleminiz için gerçekten anlamıyorum. 'Hashhnode' sınıfı sadece 'public' üyelerine sahip (neredeyse bir 'struct' yapıyor), bu yüzden herhangi bir yerde herhangi bir örnek oluşturma sorunu yok. Ve 'hashnode' sınıfının 'hashmap' sınıfına geri dönüşü yoktur. Ve "hashnode" sınıfının örneklerini yaratıyorsunuz ve bu örnekleri, '' yeni hashnode (..) 'yaptıklarında kurucuyu (dolaylı olarak) çağırarak başlatıyorsunuz. –

cevap

0

hashnode için kurucu arayan hat table = new hashnode* [table_size];olan. new'un yaptığı; her nesne için yer ayırır ve daha sonra nesnenin yapıcısını çağırır.

Derleyici için 10 (table_size) hashnode nesnelerini oluşturmalarını istiyorsunuz.

+0

şimdi anladım teşekkürler. – ashish

İlgili konular