gpt4 book ai didi

c++ - Entries() 未在映射中输入

转载 作者:行者123 更新时间:2023-11-28 05:03:21 24 4
gpt4 key购买 nike

我想将值保存在 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() 返回一个 bool 值。因此,负值和正值在 true 中转换,零在 false 中转换。因此,根据您的 operator()hash1 低于 hash2(如果它们不同)。而不好的部分是,如果 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)

关于c++ - Entries(<key,values>) 未在映射中输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com