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

Unordered map running unusually slow compared to map C++

本文关键字:地图 运行 异常 缓慢 无序 C++ 相比      更新时间:2023-10-16

我正在尝试使用无序映射对大小为 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 ] ) ); 
}
};

[unord.req]/5如果容器的键相等谓词在传递这些值时返回true,则类型为Key的两个值k1k2被视为等效。如果k1k2等效,则容器的哈希函数应为两者返回相同的值。

您的arraySizeTwoEqualityStructarraySizeTwoHashStruct违反此要求。前者声明两个"足够接近"的元素是等价的,但后者仍然给它们不同的哈希。因此,您的程序表现出未定义的行为。


[unord.req]/3每个无序关联容器都由 ...一个二进制谓词Pred,它诱导 Key 类型的值的等价关系

强调我的。arraySizeTwoEqualityStruct此外也是无效的,因为它不会诱导等价关系。特别是,它不是传递的:存在ABC的值,使得A"足够接近"BBC,但AC"不够接近"。