我正在尝试使用无序映射对大小为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 ] ) );
}
};
答案 0 :(得分:3)
[unord.req] / 5 如果容器的键相等谓词返回{{1,则认为类型为
k1
的两个值k2
和Key
是等效的}}传递这些值时。如果true
和k1
相等,则容器的哈希函数应为两者返回相同的值。
您的k2
和arraySizeTwoEqualityStruct
违反了此要求。前者声明两个“足够接近”以等效的元素,但后者仍然赋予它们不同的哈希值。因此,您的程序表现出不确定的行为。
[unord.req] / 3 :每个二进制无序容器都由...的二元谓词
arraySizeTwoHashStruct
参数化,该谓词推导等价关系键入密钥。
强调我的。 Pred
也是无效的,因为它不会引起等价关系。特别是,它不是传递的:存在值arraySizeTwoEqualityStruct
,A
和B
,使得C
与A
和{{1 }}到B
,但是B
与C
距离不够。