【发布时间】:2023-03-08 03:59:01
【问题描述】:
理论上,您应该能够在 O(1) 时间内将任意位置插入到列表中(在您选择的索引处)。但是,当使用 STL 列表时,您需要在迭代器位置插入,据我了解,迭代器位置必须增加 O(n) 次才能将其设置为所需的索引。我傻眼了,为什么会这样,肯定是我弄错了,有办法更快吗?
【问题讨论】:
-
列表实际上没有索引。您对列表的理解似乎存在根本缺陷。也许您想要
std::vector? -
一个
std::list是一个双链表。像任何其他链表一样,遍历到第 N 个元素是O(N)。如果你已经有一个迭代器指向你想要插入新元素的位置,那么它就是O(1)。 -
不,你误解了(虽然这是一个常见的误解)。使用链表,您可以在给定的 节点 的位置以恒定的时间插入。确定该节点平均需要线性时间。
-
如果您尝试使用您想要的插入类型为自己编写一个列表,这可能有助于解决您的困惑。你会在某个时候卡住,而那个确切的点就是你问题的答案。
-
“在链表中插入是一个常数时间操作”似乎是你在职业生涯早期学习的那些口头禅之一,就在忘记它为真的条件之前。你可以找到Stroustrup 最近的一段在线视频,他在视频中分享了他对随机列表插入与向量相比有多慢的惊讶。