2017-07-30 25 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

相关问题