如果哈希函数返回的值已经不包含在地图中,我希望在std::map<uint8_t* , MyObject* , lex_compare> mymap;
中保存值。数据结构是:
uint8_t*
其中uint8_t hash_value[16]
指向包含应用于类MyObject
字段的哈希函数的128位(lex_compare
)的C样式数组。我使用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
中只插入了一个元素,因此我进入无限循环。为什么?我无法解释。看看// note: no SV_POSITION in this struct
struct v2f {
float2 uv : TEXCOORD0;
};
v2f vert (
float4 vertex : POSITION, // vertex position input
float2 uv : TEXCOORD0, // texture coordinate input
out float4 outpos : SV_POSITION // clip space position output
)
{
v2f o;
o.uv = uv;
outpos = UnityObjectToClipPos(vertex);
return o;
}
我看到这个函数总是返回零值(因为在2上调用等于元素)。可能是一个微不足道的问题,但我无法看到它。
编辑: 我在比较函数中纠正了问题。但后来纠正主要问题仍然存在
答案 0 :(得分:1)
简短回答:尝试
return (memcmp(hash2,hash1,16) > 0);
长答案:memcpy()
如果第一个参数低于第二个参数则返回负值,如果它们相等则返回零,如果第一个值大于第二个值则返回正值。
但是你的operator()
返回一个布尔值。因此,在true
中转换为负值和正值,在false
中转换为零。
因此,根据您的operator()
,hash1
低于hash2
,如果它们不同。
不好的是,如果hash1
和hash2
不同,hash1
结果低于hash2
且 hash2
结果较低比hash1
。这给程序带来了不确定的行为。
解决方案:修改返回指令或以这种方式
return (memcmp(hash2,hash1,16) > 0);
或如下
return (memcmp(hash2,hash1,16) < 0);
确保true == operator()(hash1, hash2)
暗示false == operator()(hash2, hash1)