与地图C ++相比,无序地图的运行速度异常慢

时间:2018-06-24 20:31:41

标签: c++ unordered-map

我正在尝试使用无序映射对大小为2的数组进行哈希处理,然后再搜索该映射。不幸的是,这比我使用常规c ++映射时要慢得多,我认为这是不正确的,因为插入和查找是映射中的O(log(n))和无序映射中的O(1)。需要注意的一件事是,我使用的是映射中数组而不是数组中值的串联字符串值。我认为这并不重要,因为字符串连接比创建大小为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 ] ) ); 

    }

};

1 个答案:

答案 0 :(得分:3)

  

[unord.req] / 5 如果容器的键相等谓词返回{{1,则认为类型为k1的两个值k2Key是等效的}}传递这些值时。如果truek1相等,则容器的哈希函数应为两者返回相同的值。

您的k2arraySizeTwoEqualityStruct违反了此要求。前者声明两个“足够接近”以等效的元素,但后者仍然赋予它们不同的哈希值。因此,您的程序表现出不确定的行为。


  

[unord.req] / 3 :每个二进制无序容器都由...的二元谓词arraySizeTwoHashStruct参数化,该谓词推导等价关系键入密钥。

强调我的。 Pred也是无效的,因为它不会引起等价关系。特别是,它不是传递的:存在值arraySizeTwoEqualityStructAB,使得CA和{{1 }}到B,但是BC距离不够。

相关问题