对于操作count()来说,std::set和std::unordered_set哪个更快?
对于操作count()来说,std::set和std::unordered_set哪个更快?
假设sizeof(void*) == sizeof(size_t)
,并且将指针哈希化只是将其转换为size_t
。所以我想知道如果我的集合中包含一个元素,哪个更快std::set
还是std::unordered_set
?
我知道std::set
是如何工作的,但我不熟悉std::unordered_set
。嗯,我知道无序集使用哈希和桶,如果没有交集发生(这是我的情况),复杂度是O(1)。但我不知道这个常数复杂度有多大。
如果容器中的数据量相关,我的实际情况使用的少于一百¹。但我的好奇心涉及到有少量元素和大量元素的两种情况。
¹ 元素的数量很少,即使是一个std::vector
也能正常运行。
在这个问题中,我们需要比较使用std::set
为了解决这个问题,我们可以使用以下代码来进行测试和比较:
#include
#include
#include
#include
#include
int main() {
const int SIZE = 1000000;
std::vector
std::set
std::unordered_set
// Initialize vector, set, and unordered_set with random values
for (int i = 0; i < SIZE; i++) {
vec[i] = reinterpret_cast
set.insert(vec[i]);
unordered_set.insert(vec[i]);
}
// Test the operation count() for set
auto start_time_set = std::chrono::high_resolution_clock::now();
int count_set = set.count(vec[SIZE - 1]);
auto end_time_set = std::chrono::high_resolution_clock::now();
std::chrono::duration
// Test the operation count() for unordered_set
auto start_time_unordered_set = std::chrono::high_resolution_clock::now();
int count_unordered_set = unordered_set.count(vec[SIZE - 1]);
auto end_time_unordered_set = std::chrono::high_resolution_clock::now();
std::chrono::duration
// Print the results
std::cout << "count() for set: " << count_set << " (elapsed time: " << elapsed_time_set.count() << "s)" << std::endl;
std::cout << "count() for unordered_set: " << count_unordered_set << " (elapsed time: " << elapsed_time_unordered_set.count() << "s)" << std::endl;
return 0;
}
通过以上代码,我们可以测试并比较使用std::set
最后,我们将set和unordered_set中count()操作的结果和所花费的时间打印出来,以便比较它们之间的性能差异。
通过以上的文章,我们可以了解到在这个问题中,我们想要比较使用std::set
在这段内容中,讨论了在使用count()操作时,std::set
另外,某些情况下如果插入操作很少而查找操作很频繁,可以使用排序的std::vector结构,通过使用std::binary_search进行查找和插入,这样可以实现O(log n)的复杂度和具有缓存局部性的查找,以及O(n)的复杂度的插入。
总之,为了回答问题“在count()操作中,std::set