【发布时间】:2012-05-04 05:03:27
【问题描述】:
我需要维护一个项目列表(一些对象),并支持以下操作:
- 在末尾插入
- 从任何位置删除
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])
一种选择是在地图中使用迭代器,有没有更简单的方法?
【问题讨论】:
-
不保存指针,就不能只保存迭代器吗?另外,恒定时间是什么意思?简单地从 std::list 中的任何位置删除一个对象是恒定的,但找到一个对象不是。
-
问题是如果列表中有 n 个项目,我必须保存 n 个迭代器。这看起来不像是一个优雅的解决方案(顺便说一句,我是 C++ 新手)
-
根据您的用例,您可能只想使用 std::vector。删除项目的效率相对较低,O(n),但访问它们的时间是恒定的,如果您可以将项目设置为空(如果您正在存储指针)或对象中的特殊值。当然会占用更多内存,但这是个问题吗?
-
您需要一个项目列表还是一个集合?这个收藏的目的是什么?您将对其执行哪些操作?搜索?迭代?你将如何消费它们?
-
操作是上面提到的唯一操作。我将编辑问题并添加一个示例。
标签: c++ stl linked-list