C++ 不在映射中输入条目(<;键,值>;)

C++ 不在映射中输入条目(<;键,值>;),c++,c++11,stl,comparison,C++,C++11,Stl,Comparison,如果哈希函数返回的值尚未包含在映射中,我希望将值保存在std::map中。数据结构是: std::map<uint8_t* , MyObject* , lex_compare> mymap; 要确保仅在映射中未包含哈希值时插入,我使用: while(mymap.size()<R) { myObject *temp_o = new myObject(parameters); uint8_t hash_result = my_hash_function(myObject->

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

std::map<uint8_t* , MyObject* , lex_compare> mymap;
要确保仅在映射中未包含哈希值时插入,我使用:

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));
}
while(mymap.size()return\u field())//return\u field是myObject的特定字段
mymap.insert(make_pair(hash_result,temp_o));
}
但只有一个元素被插入到
mymap
中,因此我会进行无休止的循环。为什么?我无法解释。看看
lex_compare
我看到这个函数总是返回零值(因为在2个相等元素上调用)。可能是个小问题,但我看不出来

编辑:
我纠正了比较函数中的问题。但后来主要的问题仍然存在

简短的回答:试试看

return (memcmp(hash2,hash1,16) > 0);
长答案:
memcpy()
如果第一个参数小于第二个参数,则返回负值;如果它们相等,则返回零;如果第一个参数大于第二个参数,则返回正值

但是您的
操作符()
返回一个布尔值。因此,负值和正值在
true
中转换,零在
false
中转换。 因此,根据您的
操作符()
hash1
低于
hash2
,如果它们不同的话。 糟糕的是,如果
hash1
hash2
不同,
hash1
结果低于
hash2
hash2
结果低于
hash1
。这会给程序一个未定义的行为

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

return (memcmp(hash2,hash1,16) > 0);
或如下

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

要确保
true==operator()(hash1,hash2)
意味着
false==operator()(hash2,hash1)

您的比较返回大于和小于的
true
。您的哈希结果是uint\u 8。您不显示实际的代码。我怀疑你的散列函数返回了一个指向本地数组的指针。这是一个很小的错误。你肯定是对的。我正在尝试(这是一个编译时间很长的伟大图书馆)@Umbert-我有理由相信这是一个问题;我不知道这是否是唯一的问题。问题仍然存在,即地图中只输入了一个元素。运算符()始终返回0,因为在相同的哈希元素上调用,但循环中的打印给我一个不同的元素。因此,我仍然不明白错误在哪里。当然,你发现的就是其中之一。为什么对2等于散列值调用运算符()?运算符()返回true或false。调用运算符两次以测试是否相等。如果它在两个测试中都返回false,那么值是相等的。正如我在您的问题下的注释中所述:我怀疑您的哈希函数返回指向本地数组的指针。因此,在计算新哈希值的同时,更改映射中的哈希值。
return (memcmp(hash2,hash1,16) < 0);