11

我计划在 C++ 中实现一个事物列表,其中元素可能会被乱序删除。我不希望我需要任何类型的随机访问(我只需要定期扫描列表),并且项目的顺序也不重要。

所以我想std::list<Thing*> with this->position = insert(lst.end(), thing)应该做的伎俩。我希望 Thing 类记住每个实例的位置,以便我以后可以lst.erase(this->position)在恒定时间内轻松完成。

但是,我对 C++ STL 容器还是有点陌生​​,我不知道将迭代器保留这么长时间是否安全。特别是考虑到在插入的事物之前和之后会删除其他元素,然后它就消失了。

4

2 回答 2

13

在列表中,所有迭代器在插入期间保持有效,只有擦除元素的迭代器在擦除期间无效。

在您的情况下,即使在插入的 Thing* 之前和之后删除了其他元素,保持迭代器也应该没问题。

编辑

矢量和双端队列的其他详细信息:

向量

  • inserting --- 如果发生重新分配,所有迭代器都将无效,否则它是有效的。
  • 擦除----擦除点之后的所有迭代器都无效。

双端队列

  • 插入 --- 所有迭代器都无效。
  • 擦除----所有迭代器都无效。
于 2009-04-17T06:52:50.220 回答
4

这取决于您使用的容器。

检查:http
://www.sgi.com/tech/stl/ 最后查看每个容器文档,它们将描述迭代器保持有效的条件。

对于 std::list<> 它们在所有条件下都保持有效,直到它们实际引用的元素从容器中删除(此时它们无效)。

于 2009-04-17T08:53:53.673 回答