2009-04-17 54 views
11

我打算实施C++中的东西列表,其中的元素可能会被无序删除。我不指望我需要任何形式的随机访问(我只需要定期扫描列表),而且项目的顺序也不重要。C++迭代器的生命周期和有效性是什么?

所以我想到std::list<Thing*> with this->position = insert(lst.end(), thing)应该做的伎俩。我希望Thing班级记住每个实例的位置,以便我可以在以后轻松地在一段时间内轻松完成lst.erase(this->position)。但是,我仍然对C++ STL容器有点新鲜,而且我不知道如此长时间保持迭代器是否安全。尤其是,鉴于在插入Thing之前和之后将会删除其他元素。

回答

13

在列表中,所有迭代器在插入过程中保持有效,只有擦除元素的迭代器在擦除过程中变得无效。

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

编辑

矢量

矢量和deque其他细节

  • 插入---所有迭代器得到 无效的,如果重新分配情况, 否则其有效。
  • 擦除---- 擦除点无效后的所有迭代器。

双端队列

  • 插入---所有迭代器得到 无效。
  • 擦除----所有迭代器得到 无效。
+0

好的答案,这也有助于了解可能导致向量重新分配的原因。 (插入一个元素是显而易见的,但是还有其他吗?) – Malabarba 2011-10-25 21:57:19

+0

允许对矢量(包括插入和移除)的任何修改来重新分配和使迭代器失效;无论是否这样做都是实现定义的。所以最好假定以任何方式修改矢量总是使所有现有的迭代器无效。 – Miral 2012-02-02 07:32:43

3

这取决于您使用的容器。

检查:http://www.sgi.com/tech/stl/
看看在年底每个容器的文档他们将在该迭代器停留在有效的情况说明。

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

相关问题