对于操作count()。哪个更快std :: set <void *>或std :: unordered_set <void *>?</void *> </void *>

时间:2013-05-23 23:06:03

标签: c++ performance c++11

假设sizeof(void*) == sizeof(size_t)和散列指针只是将其转换为size_t。所以我想知道我的集合是否包含一个元素,它会更快std::set<void*>std::unordered_set<void*>

我知道std::set的工作原理,但我不熟悉std::unordered_set。好吧,我知道无序集使用散列和桶,如果没有交叉(这是我的情况),复杂性是 O(1)。但我不知道这种复杂程度是多少。

如果容器中有多少日期相关,我的实际情况使用不到一百¹。但是我的好奇心只涉及很少元素和很多元素的情况。

¹元素的数量很少,即使std::vector也能表现良好。

2 个答案:

答案 0 :(得分:8)

我认为重要的一点是在小脚注中:

  

元素的数量很少,即使std::vector也能表现良好。

std::vectorstd::setstd::unordered_set更加缓存,因为它在连续的内存区域中分配其元素(这是标准规定的)。

虽然std::vector的查找和插入复杂性比std::setstd::unordered_set(线性与 O(日志N)更差,并且摊销 O(1),分别),数据位置和更高的缓存命中率可能主导计算复杂性并产生更好的性能。

一般而言,无论如何,您选择的数据结构对性能的影响还取决于您希望对它们执行的操作类型及其频率 - 这在您的帖子中没有提到。

然而,在您提交之前,衡量不同的替代方案,并且当您没有证据表明它代表阻碍您的应用程序满足其性能要求的瓶颈时,总是倾向于更简单的设计

答案 1 :(得分:2)

在许多实现中,

unordered_set具有比set更好的缓存局部性。但是由于元素的数量在你的情况下是如此之小,vector可能完全适合缓存,使其成为更好的选择,尽管查找元素的O(n)复杂性。