从STL列表中删除特定节点

时间:2012-05-04 05:03:28

标签: c++ stl linked-list

我需要维护一个项目列表(某个对象),并支持以下操作:

  • 最后插入
  • 从任何位置移除

STL列表似乎是正确的选择。但是,如何在恒定时间内完成第二次操作?我可以在某处保存指向每个节点的指针并直接删除它们,但是擦除需要一个迭代器,这样就无法工作了。

使用示例:

items = list<myobj>..
items.push_back(obj1)
items.push_back(obj2)
items.push_back(obj3)
items.remove(obj2) // <- How to do this in constant time.

如果push_back以某种方式访问​​节点,我可以使用:

map[obj1] = items.push_back(obj1)
items.remove(map[obj1])

一种选择是在地图中使用迭代器,有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

折衷方案是像大多数std :: set实现一样的红黑树。它是插入,搜索和删除的O(log n)。树木基本上是最终的折衷数据结构。他们对任何事情都不是很了不起,但他们总能把工作做得很好。

否则,使用链接列表和向量来分析您的代码,并找出调整向量的大小是否真的非常糟糕(这取决于您执行此操作的频率)。


可能有一个更好(不优雅,但非常有效)的解决方案,可能只是照顾你的问题。您还没有提到如何使用列表,但是如果您可以将值保留为未使用,则可以使用向量并将元素标记为已删除而不是实际删除它。或者使用向量和一个单独的位集(或C ++ 03 vector<bool>)告诉您项目是否被删除或有效。要删除它,您只需要翻转位图中的位。迭代时,只需记住在处理内容之前检查删除位图。如果内存不是问题且速度很重要且容易/清晰度很重要,请将vector<object>替换为vector<pair<bool, object>>,其中bool是删除标记。

答案 1 :(得分:0)

您可能需要查看Boost.MultiIndex。这允许您在数据结构上组合多个索引。因此,您可以以线性空间开销为代价,不断查找和删除任何元素。