繁体   English   中英

参赛作品( <key,values> )未输入到地图中

[英]Entries(<key,values>) are not entered in a map

如果哈希函数返回映射中尚未包含的值,我想将值保存在std::map map中。 数据结构为:

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

其中uint8_t*指向一个128位C样式数组( 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个equals元素上调用了该函数)。 可能是一个小问题,但我看不到它。

编辑:我比较功能中的问题。 但是后来纠正主要问题仍然存在

简短答案:尝试

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

长答案:如果第一个参数小于第二个参数,则memcpy()返回负值;如果相等,则返回零;如果第一个参数大于第二个参数,则返回正值。

但是您的operator()返回一个布尔值。 因此,将负值和正值转换为true ,将零转换为false 因此,根据您的operator() ,如果hash1hash2不同,则它们比hash1低。 糟糕的是,如果hash1hash2不同,则hash1结果低于hash2 hash2结果低于hash1 这给程序带来了不确定的行为。

解决方法:修改返回指令或以这种方式

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

或如下

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

确保true == operator()(hash1, hash2)表示false == operator()(hash2, hash1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM