条目(<键,值>)不会在地图中输入

时间:2017-07-30 17:23:39

标签: c++ c++11 stl comparison

如果哈希函数返回的值已经不包含在地图中,我希望在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上调用等于元素)。可能是一个微不足道的问题,但我无法看到它。

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

1 个答案:

答案 0 :(得分:1)

简短回答:尝试

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

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

但是你的operator()返回一个布尔值。因此,在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)