Map vs unordered_map用于少数元素
map vs unordered_map for few elements
对于以下用例,我试图在map
和unordered_map
之间进行选择:
map
键为指针。最常见的用例是映射中将有单个元素。一般来说,map中元素的最大个数小于10。地图的访问非常频繁,速度是最重要的因素。对映射的更改很少。
虽然在这里测量速度显然是正确的方法,但此代码将在几个平台上使用,因此我试图创建一个基于元素数量在map
和unordered_map
之间进行选择的一般经验法则。我在这里看到一些帖子暗示std::map对于小数元素可能更快,但是没有给出"小"的定义。
是否有一个经验法则,当map
和unordered_map
之间的选择基于元素的数量?另一种数据结构(如通过vector
进行线性搜索)更好吗?
在您总是需要进行测量以找出在性能方面更合适的前提下,如果所有这些都是正确的:
- 地图变化不频繁;
- 地图最多包含10个元素;
- 查找将频繁;
- 你非常关心性能;
然后我会说你最好把你的元素放在std::vector
中,并对所有元素执行一个简单的迭代来找到你正在寻找的元素。
一个std::vector
将在一个连续的内存区域分配它的元素,所以缓存局部性可能会给你一个更好的性能——在缓存丢失后从主存中获取缓存行所需的时间至少比访问CPU缓存所需的时间高一个数量级。
非常有趣的是,Boost的flat_map
似乎非常适合你的用例(由Praetorian提供):
flat_map
类似于std::map
,但它被实现为有序向量。(来自在线文档)
如果你可以使用Boost,你可以试试这个
我相信对于10个或更少元素的情况,通常只有一个,对未排序向量的线性搜索将是最好的。但是,根据所使用的哈希算法,unordered_map可能更快。
相关文章:
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- C++用于循环跳过向量的元素?
- Getter 和 Setter 用于类 C++ 中的数组元素
- 为什么 std::swap 不适用于<bool> Clang/Win(英语:Clang/Win)下的矢量元素?
- std::p artition 的问题,用于分离小于枢轴的元素
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- 用于查找元素的数据结构
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 如何编写用于查找数组中一系列元素的函数?
- const 数组,用于在数组长度定义中使用其元素或为模板参数提供值
- 用于编织链接列表元素的Runner Technique
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 试图使模板用于C 中结构的元素工作
- 在一个类中向向量添加元素不适用于其他类
- 我用于汇总数组元素的 c++ 代码无法正常工作
- 用于显示矩阵元素的C 函数显示垃圾值