使用std :: map <t1,t2 =“”> :: erase(迭代器位置)?</t1,>

时间:2013-03-24 19:53:36

标签: c++ algorithm data-structures stl red-black-tree

我在cplusplus.com上读到,通过将迭代器作为参数传递来删除std::map中元素的操作是恒定时间。

如果我没有错(如果我是的话请纠正我)迭代器基本上是指向地图中元素的指针,++运算符只返回当前元素的有序后继,我猜这是怎么回事在遍历std::map时实现排序结果。

现在如果地图是红黑树,不应该删除一个元素(使用它的地址)是对数时间操作,我不知道他们是如何在恒定时间内做的(除非有一个高度内存浪费的替代方案那样做。)

2 个答案:

答案 0 :(得分:9)

对于初学者,我会对你从cplusplus.com获得的任何信息保持警惕;该网站已知有一些错误。

访问cppreference.com,我们发现复杂性摊销常量时间。这意味着任何n erase次操作序列都需要花费时间O(n),即使单个擦除操作需要的时间大于O(1)。

事实证明,插入或删除红/黑树所需的时间最终计算如下:每次插入或删除需要时间O(log n)来查找节点的位置,但之后只做摊销O(1)工作以插入或移除元素。这意味着从红/黑树中插入或删除节点所做的工作主要是确定该节点所在位置所需的工作,而不是之后重新平衡树所需的工作。因此,如果您已经有一个指向红色/黑色树的指针并且想要删除该元素,则只需要执行分摊的O(1)工作来删除该元素。每个单独的删除可能需要一些时间(最多为O(log n)),但是在n个操作的流中,完成的总工作量最多为O(n)。

请注意,该标准不要求std::map使用红色/黑色树。它可以使用另一种类型的数据结构(例如,splay treescapegoat tree或确定性skiplist),这也保证了这种时间复杂性。有趣的是,并非所有平衡二叉搜索树结构都支持分摊的O(1)删除。例如,AVL tree没有这种保证。

希望这有帮助!

答案 1 :(得分:2)

如果您将迭代器传递给map以移除元素,则根据http://www.cplusplus.com/reference/map/map/erase/分摊常量时间。

摊销的常数时间表示“如果您进行多次操作,则每次操作所需的平均时间”。因此,某些操作可能需要比常量时间更长的时间,但如果您执行相同的操作很多次,则它会按常量分摊。