std::list 和 std::vector 插入后迭代器的有效性

Validity of iterator after insert for std::list and std::vector

假设,有两个迭代器在不同的地方指向不同的地方。

对于一个列表,如果在它们之间插入一个项目,它们是否仍然有效?

如果我理解正确,std::list 对象通常实现为双向链表,因此在插入(或删除)时迭代器仍然有效。

但是,对于一个数组,我相信不是这样的。如果现在在两个迭代器之间删除了一个项目——这是否意味着指向向量末尾的项目的迭代器现在指向后续项目(或者如果第二个迭代器最后一次指向末尾迭代器)

我的理解对吗?

迭代器显示内存位置。迭代器行为取决于容器在内存中的表示。正如你所说, std::list 是使用链表实现的。节点可以在内存中的任何位置。它们与前一个节点的下一个指针相连。因此,如果您在两个项目之间插入一个项目,它们在内存中的位置将被保留。

但在 arrayvector 的情况下,容器存储为连续内存,如果您想在两个元素之间插入或删除一个项目,则必须移动其中一个元素或在其他地方构造 array/vector 。这就是迭代器在插入或删除操作中可能无效的原因。最好在迭代时使用 remove and erase idiom 而不是删除,以便您的算法从底层数据结构中抽象出来。