繁体   English   中英

std :: list c ++是顺序的,然后如何在序列中的任何位置进行插入和擦除操作的恒定时间

[英]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::liststd::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_aftererase_after

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM