Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于操作count()。哪个更快std::set<;无效*>;或标准::无序集<;无效*>;?_C++_Performance_C++11 - Fatal编程技术网

C++ 对于操作count()。哪个更快std::set<;无效*>;或标准::无序集<;无效*>;?

C++ 对于操作count()。哪个更快std::set<;无效*>;或标准::无序集<;无效*>;?,c++,performance,c++11,C++,Performance,C++11,假设sizeof(void*)==sizeof(size\u t),散列指针只是将其转换为size\u t。因此,我想知道我的集合是否包含一个元素,它将更快std::set或std::unordered\u set 我知道std::set的工作原理,但我不熟悉std::unordered\u set。我知道无序集使用散列和桶,如果不发生交集(这是我的情况),复杂性是O(1)。但我不知道这种恒定的复杂性有多大 如果容器中有多少日期是相关的,那么我的实际场景使用的不到一百。但我的好奇心涉及到两种情况

假设
sizeof(void*)==sizeof(size\u t)
,散列指针只是将其转换为
size\u t
。因此,我想知道我的集合是否包含一个元素,它将更快
std::set
std::unordered\u set

我知道
std::set
的工作原理,但我不熟悉
std::unordered\u set
。我知道无序集使用散列和桶,如果不发生交集(这是我的情况),复杂性是O(1)。但我不知道这种恒定的复杂性有多大

如果容器中有多少日期是相关的,那么我的实际场景使用的不到一百。但我的好奇心涉及到两种情况,一种是要素少,一种是要素多


元素的数量非常少,即使是
std::vector
也可以很好地执行。

无序集
在许多实现中比
具有更好的缓存局部性。但是,由于在您的例子中元素的数量非常少,
向量很可能完全适合缓存,这使得它成为一个更好的选择,尽管查找元素的复杂性为O(n)

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

元素的数量非常少,即使是
std::vector
也可以很好地执行

std::vector
std::set
std::unordered_set
更便于缓存,因为它在连续的内存区域中分配其元素(这是标准要求的)

虽然
std::vector
的查找和插入复杂度比
std::set
std::无序_集
的查找和插入复杂度更差(分别为线性对O(log N)和摊销O(1)),但数据局部性和更高的缓存命中率可能会主导计算复杂度,并产生更好的性能

总之,对您选择的数据结构性能的影响也取决于您希望对其执行的操作类型和频率——这在您的帖子中没有提到


然而,与往常一样,在做出承诺之前衡量不同的备选方案,当您没有证据表明它代表了阻碍您的应用程序满足其性能要求的瓶颈时,请始终支持更简单的设计。

哈希表倾向于使用更多的内存来在更短的时间内执行访问。为什么不比较您感兴趣的操作的复杂性,并根据需要进行决定那个看,也许还有。天啊,我忘了提我的问题了。我正在做的操作是检查集合中是否包含元素。我刚刚编辑了它。@syam唯一重要的操作是count()。它在集合上有复杂度日志(n),在无序集合上有1。我只是想知道这个恒定的复杂性有多大。我要强调的是,这不是我假装要做的微观优化,这只是我想知道的事情。+1代表“测量”——这是人们需要理解的。您可能还想补充的一点是,如果插入很少且查找频繁,那么使用std::binary_搜索查找和插入内容的排序std::vector可能是一种方法;通过这种方式,您可以获得O(logn)&缓存位置以进行查找,并获得O(n)以进行插入。@cristicbz:这一点很好。我认为您的评论,作为答案之后的第一条评论,并具有我的+1,即使不编辑答案,也会被注意到并考虑;)