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



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

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

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

然而,对于一个数组,我相信情况并非如此。如果一个项目现在在两个迭代器之间被删除,这是否意味着指向向量末尾的项目的迭代器现在指向下一个项目(或者如果第二个迭代者指向最后一个时间,则指向末尾迭代器(

我的理解正确吗?

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

但在arrayvector的情况下,如果要在两个元素之间插入或删除一个项,则必须将其中一个元素移位或在其他地方构造数组/向量,其中容器存储为连续内存。这就是迭代器在插入或删除操作中可能无效的原因。最好使用删除和擦除习惯用法,而不是在迭代时删除,这样您的算法就可以从底层数据结构中抽象出来。

最新更新