C ++ STL中set和hashset有什么区别?

时间:2010-03-25 18:25:19

标签: c++ performance stl set hashset

我应该何时选择其中一个? 您是否建议使用正确的STL容器?

5 个答案:

答案 0 :(得分:31)

hash_set是不属于C ++标准的扩展。对于set,查找应该是O(1)而不是O(log n),因此在大多数情况下它会更快。

当您遍历容器时,将会看到另一个区别。 set将按排序顺序发送内容,而hash_set基本上是随机的(感谢Lou Franco)。

编辑:C ++标准的C ++ 11更新引入了unordered_set,应该首选而不是hash_set。性能将类似,并由标准保证。名称中的“无序”强调迭代它将产生没有特定顺序的结果。

答案 1 :(得分:13)

stl::set实现为二叉搜索树。 hashset实现为哈希表。

这里的主要问题是许多人使用stl::set认为它是一个查找O(1)的哈希表,它不是,也没有。它确实有O(log(n))用于查找。然后阅读有关二进制树与哈希表的其他内容,以更好地了解数据结构。

答案 2 :(得分:3)

要记住的另一件事是,使用hash_set,你必须提供散列函数,而一个集只需要一个比较函数('<'),它更容易定义(并为本机类型预定义)。

答案 3 :(得分:1)

hash_set将由散列表实现,散列表主要有O(1)个操作,而一个集合由某种具有O(log n)操作的树(AVL,红黑等)实现,但按排序顺序。

编辑:我写过树是O(n)。那是完全错误的。

答案 4 :(得分:1)

我认为还没有人回答问题的其他部分。

使用hash_set或unordered_set的原因通常是O(1)查找时间。我说通常是因为每隔一段时间,根据实现,哈希可能必须被复制到更大的哈希数组,或者哈希桶最终可能包含数千个条目。

使用集合的原因是您经常需要集合中最大或最小的成员。哈希没有顺序,因此没有快速找到最小项目的方法。树有顺序,所以最大或最小很快。 O(log n)表示一个简单的树,O(1)如果它包含指向末尾的指针。