在set中查找比unordered_map更快[关闭]

问题描述 投票:-1回答:2

我有一个关于查找速度的问题。我想知道哪个STL容器可以在C ++中产生最快的查找时间。 unordered_map出现在我的脑海中,因为它是通过哈希映射实现的,但我担心它的性能会受到惩罚,因为它包含键值对,而set只包含键。我想答案取决于1)密钥的数据类型; 2)set的STL实现。

换句话说,哪个容器更快地搜索密钥的存在,是set,unordered_map还是其他什么?

Edit:

希望通过对容器的实现或机制的更多解释来回答答案。例如,unordered_map很快,因为它是用hashmap实现的。这比说“这取决于需要”更有帮助。谢谢!

c++ stl set unordered-map
2个回答
2
投票

这在很大程度上取决于数据的分布,数据集的大小,编译器,工具链......

您可以知道的唯一方法是根据您的用例进行测量。

在为您的任务选择the appropriate container之后执行此操作,然后仅在您发现需要时切换到其他内容并且通过这样做可以为您的用例获得更好的性能。

基于你的问题,我会说选择是在setunsorted_set之间。另一方面,如果您实际上还不知道您的数据是否同时具有键和值,那么您可能还没准备好开始分析您的解决方案。


0
投票

从不同的角度考虑这个观点,

由于性能是您在此处感兴趣的,因此您可能希望以最佳方式利用缓存行来设计数据结构

如果元素的数量不是太高,那么向量将胜过所有其他容器。在这种情况下,因为向量将元素存储在连续的内存位置,并且您的缓存喜欢连续的内存分配

您还提到了阻碍查找速度的键值对。从缓存行角度解决此问题的一种方法是将密钥存储在连续的数据结构中,仅使用密钥进行查找。只有当你有一个命中时,你可能想要从你的键值对中读取相应的值

Check out this talk by Mike acton for more on this

© www.soinside.com 2019 - 2024. All rights reserved.