【问题标题】:Validity of iterator after insert for std::list and std::vector [duplicate]插入 std::list 和 std::vector 后迭代器的有效性 [重复]
【发布时间】:2020-11-22 20:57:41
【问题描述】:

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

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

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

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

我的理解正确吗?

【问题讨论】:

标签: c++ iterator stdvector stdlist


【解决方案1】:

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

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

【讨论】:

  • 让我说清楚 - 在向量的情况下,如果某些东西被删除,那么迭代器就会变得无效(因为向量有可能被移动了?)
  • @Lost1,从向量中擦除元素永远不会导致重新分配,因此该元素之前的迭代器保持有效,而其之后的迭代器无效。
  • 是的,元素肯定被移动了。但这取决于擦除的实现。一个编译器可以在不同的内存中分配一个带有剩余元素的新向量,而不是移动剩余的元素。但无论如何,迭代器都不会保持有效。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 2014-05-23
  • 2011-09-07
  • 2011-04-14
  • 1970-01-01
  • 2018-06-06
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多