C++标准LIB:实现链表中的常量删除

C++标准LIB:实现链表中的常量删除,c++,std,C++,Std,我希望使用标准的库数据结构,因为可以很容易地重写分配器,以获得一个可能的双链接列表,该列表允许在给定元素指针的情况下执行常量时间删除操作 此功能是否内置于任何标准库数据结构中?想象一下下面的列表: myList = [ elementA, elementB, elementC ] 如果可以这样说的话,删除elementB是列表大小中的固定时间: elementB.previous.next = pointer_to(elementC) 。。。或者我必须建立自己的链表才能实现这一点?内置的st

我希望使用标准的库数据结构,因为可以很容易地重写分配器,以获得一个可能的双链接列表,该列表允许在给定元素指针的情况下执行常量时间删除操作

此功能是否内置于任何标准库数据结构中?想象一下下面的列表:

myList = [ elementA, elementB, elementC ]
如果可以这样说的话,删除elementB是列表大小中的固定时间:

elementB.previous.next = pointer_to(elementC)
。。。或者我必须建立自己的链表才能实现这一点?

内置的std::list支持元素的固定时间删除

引用以下文件:

列表是序列容器,允许在序列中的任意位置执行固定时间的插入和擦除操作,并在两个方向上进行迭代

实施过程实际上是一个双重链接列表:

列表容器实现为双链接列表;双链接列表可以将它们包含的每个元素存储在不同的、不相关的存储位置。顺序是通过与前一个元素的链接和后一个元素的链接的每个元素的关联来保持的

要从列表中删除元素,只需使用擦除成员函数:

std::list mylist;
std::list::iterator it = /* find an element */;

// remove the element in constant time
mylist.erase(it);

在C++11中,使用迭代器std::list::erase const_迭代器的位置被定义为常数时间。这是一个双链接列表。因此,这应该适合您的需要。

对于双链接列表,有一个,它支持在给定迭代器但没有指向该元素的指针的情况下,以恒定时间删除元素

C++11添加了一个单链表。这与您描述的不完全一样:只有在前面的元素有迭代器的情况下,才能在固定时间内删除元素


如果您真的想使用指向元素的指针而不是迭代器来操作容器,那么您必须放弃非侵入式STL模型,使用类似于Boost的东西。

您不能使用单链接列表,但可以使用双链接列表。给定指向元素的指针,没有。但是每个人的回答都好像你说给定了一个迭代器。你只有一个指针而不是迭代器,这对这个问题很重要吗?@Zach是的,即使列表被修改,列表迭代器也会指向同一个元素。除了当一个元素被擦除时,指向该元素的迭代器当然是无效的。@Zach:是的,迭代器就是这样工作的,除非当容器(如vector)移动元素时,迭代器无效,但列表中不会发生这种情况。根据设计,它们就像指向容器中某个特定元素的指针。@Zach:如果将“插入”与“推”结合使用,则使用“开始”即可。如果使用push_back插入,则使用它=endlst-信息技术或者是贝金。insert_after将迭代器返回到新插入的元素。但这假定您拥有该位置。我有一个指向元素的指针,而不是位置。仍然可以使用std::list实现固定时间删除吗?@Zach编辑/更正mylist.remove*ptrToItem;将删除该项目,但不是固定时间。你需要一个迭代器来处理这个项目。这个时间是常数吗?文档似乎表明移除在列表中迭代,即线性时间-或者这是未记录的行为@扎克:不,如果你想使用标准容器,你必须使用迭代器而不是指针。@扎克你可以用迭代器,而不是指针。您不必遍历整个列表。还要注意,在幕后,迭代器只是指针,也就是说,单个指针是列表迭代器的唯一数据成员。这是不能保证的,并且在技术上依赖于实现,但我所知道的所有实现都只是使用一个指针。其他数据结构的迭代器不一定如此。有趣的是,Boost intrusive element.unlink中存在没有迭代器/索引的O1删除。我只能想象这在一些非常有限的用例中有用。。。但这种模式在过去赢得NT链表的老C开发者中似乎很流行