我应该使用 std::set 还是 std::unordered_set 作为一组指针?
Should I use std::set or std::unordered_set for a set of pointers?
我有一套指南。在第一步中,我插入数据指针,在第二步中,我遍历整个集合并对元素进行一些处理。顺序并不重要,我只需要避免重复,指针比较就可以正常工作。
我的问题是,出于相同目的使用无序集是否有好处。无序集的插入速度更快吗?
正如 Ami Tavory 评论的那样,如果您不需要订单,那么通常最好选择未排序的容器。原因是如果顺序以某种方式提高了性能,无序容器仍然可以自由使用它,因此无论如何都能获得相同或更好的复杂性。
无序集合的缺点是它们通常需要针对键类型的哈希函数。如果制作一个太难或太贵,那么不使用哈希的容器可能会更好。
在 C++ 的标准库中,std::set
的平均插入复杂度是 O(log(N)),而 std::unordered_set
是 O(1)。除此之外,使用 std::unordered_set
.
时平均缓存未命中率可能较低
不过归根结底,这只是理论。您应该尝试一些听起来不错的东西,然后对其进行分析以查看它是否确实如此。
我有一套指南。在第一步中,我插入数据指针,在第二步中,我遍历整个集合并对元素进行一些处理。顺序并不重要,我只需要避免重复,指针比较就可以正常工作。
我的问题是,出于相同目的使用无序集是否有好处。无序集的插入速度更快吗?
正如 Ami Tavory 评论的那样,如果您不需要订单,那么通常最好选择未排序的容器。原因是如果顺序以某种方式提高了性能,无序容器仍然可以自由使用它,因此无论如何都能获得相同或更好的复杂性。
无序集合的缺点是它们通常需要针对键类型的哈希函数。如果制作一个太难或太贵,那么不使用哈希的容器可能会更好。
在 C++ 的标准库中,std::set
的平均插入复杂度是 O(log(N)),而 std::unordered_set
是 O(1)。除此之外,使用 std::unordered_set
.
不过归根结底,这只是理论。您应该尝试一些听起来不错的东西,然后对其进行分析以查看它是否确实如此。