迭代unordered_set的效率如何?

时间:2016-02-28 18:31:14

标签: c++ c++11 stl

迭代unordered_set是否需要查看哈希表的每个桶?如果是这样,那不是很低效吗?如果我想经常迭代一组但仍然需要删除O(1)时间unordered_set仍然是最好的数据结构吗?

3 个答案:

答案 0 :(得分:2)

实际上,std::unordered:set的常见实现将所有元素链接在一起,就像std::forward_list一样,因此遍历容器基本上等同于遍历列表(详细信息here)。在任何情况下,如果对您的程序有疑问,请查看结果是否符合您的需求。

答案 1 :(得分:1)

迭代哈希表会慢于迭代vector吗?是。 vector将连续存储其元素;哈希表需要一些方法来识别存储桶是否包含数据。一些哈希表为每个桶提供映射到同一桶的值的链接列表;其他人使用其他方法。无论哪种方式,unordered_set迭代器都需要查看每个桶并确定它是否为空。这并不像指针算术那么快。

但是,我不会将花在空桶上的额外时间分类为#34;效率非常低"。仅仅因为它没有排序vector那么快并不意味着它效率低下。您仍然可以拥有缓存一致性,因为存储桶可能不占用那么多内存,而测试空存只是一个缓存的内存提取。

最后,每个数据结构都有权衡。如果你想要O(1)查找和删除,哈希表是获得它的唯一方法。这意味着迭代将花费比vector更长的时间。但不会像set那样长。

答案 2 :(得分:0)

散列表将数据存储在向量中,并且通过将密钥转换为散列数(通常为long)来索引所有内容,该散列数成为所需元素的向量中的索引,还有使用向量的散列表里面的向量来做到这一点。 如果您遍历std::unordered_set,则只需花费O(n),因为它类似于遍历std::vector