【发布时间】:2021-05-30 17:31:01
【问题描述】:
我读了很多关于 unordered_map 速度不是很快的文章,但我想知道这样做的最佳选择是什么:
我需要为整数参数的函数缓冲计算结果。我不提前知道将要求什么范围或间隔。以最大分辨率存储在向量中会消耗太多内存。
所以我正在使用
unordered_map<unsigned long, pair<T, long>>
其中键是要计算的函数的参数,对中的第一个是类型 T 的计算结果,对中的第二个是该计算的版本信息。
只有当 unordered_map not 包含元素 或 它包含它但版本已过时,才会执行计算,然后将其添加到 unordered_map。查找函数如下所示:
template<typename T> class BufferClass{
long MyVersion;
unordered_map<unsigned long, pair<T,long>> Buffer;
public:
BufferClass(): MyVersion{1} {};
T* GetIfValid(unsigned long index)
{
if (!Buffer.count(index)) return nullptr;
pair <T,long> &x{Buffer.at(index)};
if (x.second!=MyVersion) return nullptr;
return &x.first;
}
/* ...Functions to set elements...*/
}
如您所见,我将元素有效性检查和检索结合在一个函数中,因此我只需要对两者进行一次查找。
分析器显示大部分计算时间都用在了与 unordered_map 相关的哈希函数 __constrain_hash 中。
这样存储和检索值的最快方法是什么?存储的索引列表预计是不连续的(会有很多“漏洞”),第一个和最后一个索引也大多是未知的。
T 通常是“小”数据类型(如双精度或复数)。
谢谢!
马丁
【问题讨论】:
-
"分析器显示大部分计算时间都用在了与 unordered_map 相关的哈希函数 __constrain_hash 中。" ... 和?分析器将始终显示大部分计算时间在某处用完。问题是是否花费了太多时间。所以……是吗?您多久调用一次?您希望在一秒钟内进行多少次此类调用?
-
存在平面地图实现,它们在非常特定的使用模式下可以比 unordered_map 执行得更好,但它们都有权衡和限制。一般来说,坚持使用通用哈希映射,例如std::unordered_map (并修复您对它的使用以更优化,如答案中所述)
标签: c++ c++17 unordered-map