标准:列表c++;是连续的,那么插入和擦除操作在序列中的任何位置都需要恒定的时间 在C++引用中,我读到“列表是序列容器,允许在序列内的任意位置插入和擦除操作,并在两个方向上进行迭代。” 我的疑问是,如果它是连续的,那么删除和插入一个节点怎么可能需要固定的时间。我们必须按顺序遍历才能到达该节点。删除节点取决于它的位置
O(1)参考插入/删除节点的复杂性,前提是您已经拥有该节点的句柄(以迭代器的形式)。获得列表第i个元素的迭代器(给定第一个元素的迭代器)是O(N)标准:列表c++;是连续的,那么插入和擦除操作在序列中的任何位置都需要恒定的时间 在C++引用中,我读到“列表是序列容器,允许在序列内的任意位置插入和擦除操作,并在两个方向上进行迭代。” 我的疑问是,如果它是连续的,那么删除和插入一个节点怎么可能需要固定的时间。我们必须按顺序遍历才能到达该节点。删除节点取决于它的位置,c++,std,C++,Std,O(1)参考插入/删除节点的复杂性,前提是您已经拥有该节点的句柄(以迭代器的形式)。获得列表第i个元素的迭代器(给定第一个元素的迭代器)是O(N) 在判断std::list与std::vector的相对优点时,这一点常常被忽略。但请注意,插入和擦除元素都返回迭代器,可用于进一步的插入/擦除操作。在给定节点之前插入(我们称之为pos),或作为最后一个节点,或删除给定节点是一个固定时间操作 std::list可以实现为双链接列表。序列容器不应与连续内存需求混淆。因为列表未排序。如果仔细观察,将元素放
在判断
std::list
与std::vector
的相对优点时,这一点常常被忽略。但请注意,插入和擦除元素都返回迭代器,可用于进一步的插入/擦除操作。在给定节点之前插入(我们称之为pos
),或作为最后一个节点,或删除给定节点是一个固定时间操作
std::list
可以实现为双链接列表。序列容器不应与连续内存需求混淆。因为列表未排序。如果仔细观察,将元素放入列表的实际函数是list::insert(提示,元素)
()。即,对于每次插入,添加元素的位置是已知的,因此时间是恒定的
例如,
list::push_front(element)
是insert(begin(),element)
[这主要是一个注释,但不适合放在页边空白处]
请注意,std::list
不能作为单个链表来实现,以满足复杂性要求:
- 即使您已经有了单链表节点的句柄,也不能以固定时间在其前面插入(或删除)(因为您需要访问上一个节点)
这就是为什么
std::forward_list
只提供insert_after
和erase_after
如果您有特定节点的迭代器,插入/删除需要固定的时间。但是,如果没有特定的迭代器,则必须迭代到该位置,这不是固定时间。只需使用基本的insert()
,emplace()
和erase()
函数将迭代器返回到插入或删除的位置即可。但是,pushFront()
,popFront()
,pushBack()
,和popBack()
都返回void。因此,希望为给定元素启用恒定时间删除的用户不得使用pushXXXX()
将该元素添加到列表中。