无序地图与地图C++相比运行异常缓慢

无序地图与地图C++相比运行异常缓慢,c++,unordered-map,C++,Unordered Map,我试图使用无序映射对大小为2的数组进行散列,稍后再搜索映射。不幸的是,这比我用普通的C++地图慢得多,因为我不认为它是正确的,因为插入和查找是ORN在地图上,O1是无序的地图。需要注意的一点是,我使用了映射中数组中值的串联字符串值,而不是数组。但我认为这并不重要,因为字符串串联比创建大小为2的数组更昂贵。我已附上相关代码 谢谢大家: struct arraySizeTwoEqualityStruct { bool operator()( const array< double,

我试图使用无序映射对大小为2的数组进行散列,稍后再搜索映射。不幸的是,这比我用普通的C++地图慢得多,因为我不认为它是正确的,因为插入和查找是ORN在地图上,O1是无序的地图。需要注意的一点是,我使用了映射中数组中值的串联字符串值,而不是数组。但我认为这并不重要,因为字符串串联比创建大小为2的数组更昂贵。我已附上相关代码

谢谢大家:

struct arraySizeTwoEqualityStruct 
{

    bool operator()( const array< double, 2 >& leftArraySizeTwo, 
                     const array< double, 2 >& rightArraySizeTwo ) const 
    {

        return 
                abs( leftArraySizeTwo[ 0 ] - rightArraySizeTwo[ 0 ] ) < 0.0001 &&
                abs( leftArraySizeTwo[ 1 ] - rightArraySizeTwo[ 1 ] ) < 0.0001;

    }

};


struct arraySizeTwoHashStruct 
{

    size_t operator( )( const array< double, 2 >& arrayToHash ) const
    {

        return ( hash< double > ( ) ( arrayToHash[ 0 ] ) ^ hash< double > ( ) ( arrayToHash[ 1 ] ) ); 

    }

};
[unord.req]/5如果传递给容器的键相等谓词时返回true,则认为Key类型的两个值k1和k2是等效的。如果k1和k2是等效的,则容器的哈希函数应为两者返回相同的值

您的ArraySizeTwoQualityStruct和arraySizeTwoHashStruct违反了此要求。前者声明的两个元素足够接近,可以等效,但后者仍然提供不同的散列。因此,您的程序表现出未定义的行为

[unord.req]/3每个无序关联容器由以下参数化。。。一种二进制谓词Pred,在Key类型的值上产生等价关系


我的。arraySizeTwoEqualityStruct另外无效,因为它不会产生等价关系。特别是,它不是可传递的:存在值A、B和C,使得A与B足够接近,B与C足够接近,但A与C不够接近。

我相信您的程序表现出未定义的行为。比较相等的元素必须具有相同的哈希。来自帮助:寻求调试帮助的问题此代码为什么不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。请给出一个例子,你有没有分析过这两种情况,看看减速或差异在哪里?