【发布时间】:2015-03-31 17:29:16
【问题描述】:
我已经阅读到将项目添加到 std::vector 末尾的时间复杂度是摊销常数,并且在 std::deque 的顶部和底部插入项目是常数。因为这两个容器都有一个随机访问迭代器,因此访问元素在任何索引处都是恒定的。如果我有任何这些事实错误,请告诉我。我的问题是,如果访问 std::vector 或 std::deque 中的元素是恒定的,那么为什么通过擦除 O(n) 删除元素的时间复杂度。 here 这里的答案之一指出通过擦除删除元素是 O(n)。我知道擦除删除了起始迭代器和结束迭代器之间的元素,所以答案基本上意味着它的O(n) 取决于两个迭代器之间的元素数量以及从任何索引中的向量/双端队列中删除单个元素会是零吗?
【问题讨论】:
-
deque::erase应该比vector::erase快(对于一个普通元素),因为它只需要重新洗牌受影响的块中的元素,而不是整个vector. -
@Walter:你确定吗?
-
@Walter 这不完全正确,请参阅我的回答和demo
-
@Mehrdad 不,我不确定,只是基于我将实现的想法(并假设只删除一个元素)。事实上,如果擦除不保留剩余元素的顺序是可能的/允许的,这可以在恒定时间内完成!为什么标准不明确支持这一点? (您可以简单地通过首先将最后一个元素与要擦除的元素交换,然后擦除最后一个元素来实现这一点,但这可能会更慢,因为交换可能比单次移动更昂贵。)
-
@Walter:嗯,我很确定这是错误的,因为否则找到两个迭代器之间的距离不会花费恒定的时间。