如果哈希函数返回映射中尚未包含的值,我想将值保存在std::map
中。数据结构为:
std::map<uint8_t* , MyObject* , lex_compare> mymap;
其中,
uint8_t*
指向128位(uint8_t hash_value[16]
)的C样式数组,其中包含应用于类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个equals元素上被调用)。可能是一个微不足道的问题,但我看不到它。编辑:
我更正了比较功能中的问题。但是后来纠正主要问题仍然存在
最佳答案
简短答案:尝试
return (memcmp(hash2,hash1,16) > 0);
长答案:
memcpy()
如果第一个参数小于第二个参数,则返回负值;如果相等,则返回零;如果第一个参数大于第二个参数,则返回正值。但是您的
operator()
返回一个布尔值。因此,负值和正值在true
中转换,而零在false
中转换。因此,根据您的
operator()
,如果hash1
不同于hash2
,则它们低于hash1
。糟糕的是,如果
hash2
和hash1
不同,则hash2
结果低于hash2
,并且hash1
结果低于true == operator()(hash1, hash2)
。这给程序带来了不确定的行为。解决方法:修改返回指令或以这种方式
return (memcmp(hash2,hash1,16) > 0);
或如下
return (memcmp(hash2,hash1,16) < 0);
确保
false == operator()(hash2, hash1)
暗示