我应该何时选择其中一个? 您是否建议使用正确的STL容器?
答案 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)如果它包含指向末尾的指针。