[英]std::list c++ is sequential then how it can take constant time for insert and erase operations anywhere within the sequence
在c ++参考文献中我读到“列表是序列容器,它允许在序列中的任何地方进行恒定时间插入和擦除操作,并在两个方向上进行迭代。” 我怀疑的是,如果它是顺序的,那么如何花费恒定的时间来删除和插入节点。任何方式我们必须顺序遍历以到达该节点。 删除节点取决于其位置
O(1)指的是插入/擦除节点的复杂性,前提是您已经有一个句柄(以迭代器的形式)到该节点 。 给定第一个迭代器的列表的第i个元素的迭代器是O(N)。
在判断std::list
与std::vector
的相对优点时,经常会忽略这一点。 但请注意,插入和擦除元素都返回可用于进一步插入/擦除操作的迭代器。
在给定节点之前插入(让我们称之为pos
)或作为最后一个节点或删除给定节点是一个恒定时间操作。
std::list
可以实现为双向链表。 序列容器不应与连续的内存要求混淆。
因为列表没有排序。 如果仔细观察,将元素放入列表的实际函数是list::insert(hint, element)
( http://www.cplusplus.com/reference/list/list/insert/ )。 即,对于每次插入,添加元素的位置是已知的,因此是恒定的时间。
例如list::push_front(element)
是insert(begin(), element)
缩写。
[这主要是一个评论,但它不符合边际]
请注意, 无法将std::list
实现为单个链表以满足复杂性要求:
这就是为什么std::forward_list
只提供insert_after
和erase_after
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.