问题 C ++迭代器的生命周期和有效性是什么?


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

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

但是,我对C ++ STL容器仍然有点新意,我不知道将迭代器保持这么长时间是否安全。特别是,鉴于在插入Thing之前和之后将删除其他元素。


10181
2018-04-17 06:40


起源



答案:


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

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

编辑

vector和deque的其他细节:

向量

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

双端队列

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

13
2018-04-17 06:52



很好的答案,它也有助于了解可能导致向量重新分配的原因。 (插入一个元素是显而易见的,但还有其他吗?) - Malabarba
允许对向量的任何修改(插入和删除)重新分配并使迭代器无效;是否这样做是实现定义的。所以你最好假设以任何方式修改向量总是使所有现有的迭代器无效。 - Miral


答案:


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

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

编辑

vector和deque的其他细节:

向量

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

双端队列

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

13
2018-04-17 06:52



很好的答案,它也有助于了解可能导致向量重新分配的原因。 (插入一个元素是显而易见的,但还有其他吗?) - Malabarba
允许对向量的任何修改(插入和删除)重新分配并使迭代器无效;是否这样做是实现定义的。所以你最好假设以任何方式修改向量总是使所有现有的迭代器无效。 - Miral


这取决于您使用的容器。

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

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


3
2018-04-17 08:53



谢谢(你的)信息。我已经在使用SGI的文档,但我想我忽略了这些注释,并没有注意到答案就在那里。 - PypeBros