与地图C++相比,无序地图运行异常缓慢
Unordered map running unusually slow compared to map C++
我正在尝试使用无序映射对大小为 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
的两个值k1
和k2
被视为等效。如果k1
和k2
等效,则容器的哈希函数应为两者返回相同的值。
您的arraySizeTwoEqualityStruct
和arraySizeTwoHashStruct
违反此要求。前者声明两个"足够接近"的元素是等价的,但后者仍然给它们不同的哈希。因此,您的程序表现出未定义的行为。
[unord.req]/3每个无序关联容器都由 ...一个二进制谓词
Pred
,它诱导 Key 类型的值的等价关系。
强调我的。arraySizeTwoEqualityStruct
此外也是无效的,因为它不会诱导等价关系。特别是,它不是传递的:存在A
、B
和C
的值,使得A
"足够接近"B
,B
C
,但A
与C
"不够接近"。
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么不;名字在地图上是按顺序排列的吗
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 基于多个条件处理地图中的所有元素
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 与地图C++相比,无序地图运行异常缓慢
- 使用地图找不到可能的运行时错误
- 标准::地图未按预期运行
- c++地图值不改变运行时,我做错了什么