2017-07-30 27 views
0

如果散列函數返回一個尚未包含在地圖中的值,我希望將值保存在std::map中。該數據結構是:未在地圖中輸入條目(<key,values>)

std::map<uint8_t* , MyObject* , lex_compare> mymap; 

uint8_t*其中點C風格陣列128位(uint8_t hash_value[16])的含有施加到MyObject類的字段的散列函數。我用lex_compare用於個性化的比較:

struct lex_compare { 
bool operator() (const uint8_t *hash1, const uint8_t *hash2) const { 
    /*for(int i=0 ; i<16 ; i++) 
      { 
       cout<<(unsigned int)hash1[i]<<" "; 
      } 
      cout<<endl<<endl; 
      for(int i=0 ; i<16 ; i++) 
      { 
       cout<<(unsigned int)hash2[i]<<" "; 
      } 
    int m=memcmp(hash2,hash1,16); 
    cout<<"m is è"<<m<<endl;*/ 
    return (memcmp(hash2,hash1,16)<0); //compare 16 byte. 
    } 
}; 

爲了確保插入僅當散列值尚未包含在我使用地圖:

while(mymap.size()<R) 
{ 
myObject *temp_o = new myObject(parameters); 
uint8_t hash_result = my_hash_function(myObject->return_field()) // return_field is a specific field of myObject 
mymap.insert(make_pair(hash_result,temp_o)); 
} 

但只有一個元件插入mymap,從而我進入無盡的循環。爲什麼?我無法解釋它。看看lex_compare我看到這個函數總是返回零值(因爲在2個等於元素上被調用)。可能是一個微不足道的問題,但我無法看到它。編輯: 我糾正比較功能的問題。但後來修正的主要問題仍然是

+2

您的比較返回TRUE兩個大於和小於。 – molbdnilo

+1

你的hash_result是一個uint_8。你不顯示實際的代碼。我懷疑你的哈希函數返回一個指向本地數組的指針。 – 2017-07-30 18:12:40

回答

1

簡短的回答:嘗試用

return (memcmp(hash2,hash1,16) > 0); 

龍答:memcpy()返回一個負值,如果第一個參數比第二低,零,如果他們是平等的,如果正值第一個值大於第二個值。

但你的operator()返回一個布爾值。所以負值和正值在true中轉換,零值在false中轉換。 因此,根據您的operator()hash1低於hash2,如果它們不同。 而壞的部分,如果hash1hash2是不同的,hash1結果比hash2hash2結果低於hash1低。這給程序一個未定義的行爲。

解決方法:修改返回指令或以這種方式

return (memcmp(hash2,hash1,16) > 0); 

或如下

return (memcmp(hash2,hash1,16) < 0); 

,以確保true == operator()(hash1, hash2)暗示false == operator()(hash2, hash1)

+0

微不足道的錯誤。當然你是對的。我試圖(這是一個偉大的圖書館,編譯時間很長) – Umbert

+0

@Umbert - 我確信這是一個問題;我不知道這是唯一的問題。 – max66

+0

問題依然存在,即只有一個元素被輸入到地圖中。 operator()總是返回0,因爲在相同的散列元素上被調用,但是循環中的打印給了我一個不同的元素。因此,我仍然不明白錯誤在哪裏。當然,你發現是一個。爲什麼operator()被調用2等於散列值? – Umbert

相關問題