迭代c++ unordered_map的时间复杂度

Time complexity of iterating through a C++ unordered_map

本文关键字:时间复杂度 map c++ unordered 迭代      更新时间:2023-10-16

我知道c++ STL中的unordered_map是作为哈希表实现的,由与哈希值对应的桶组成。插入、删除和元素搜索的时间保证是平摊常数。然而,我不太明白迭代器是如何在这种数据结构上工作的。当我增加迭代器时,它怎么知道下一个位置在哪里?使用迭代器遍历unordered_map时,时间复杂度是多少?寻找迭代器下一个位置的时间是常数吗?我在 c++标准库:教程和参考一书中找到了一些关于unordered_map的内部结构的信息,但我找不到我问题的答案。希望有人能帮忙!

谢谢。

哈希表是使用包含链表的桶实现的。所以迭代很容易:

  1. 查看当前节点是否有下一个指针。
  2. 如果当前节点没有下一个指针,则转到下一个有节点的桶。
  3. 如果没有这样的节点,那么迭代就完成了。

(通过查找第一个包含节点的桶来查找第一个节点)

直观地说,由于使用上述算法遍历整个哈希表是O(n),因此看起来每个"下一步"操作都是摊销常数时间。