C++ 中的迭代器失效


在 C++ 中,我们有不同的容器,例如 vector、list、set、map 等。要遍历这些容器,我们可以使用迭代器。在使用 C++ 中的迭代器时,我们应该小心。当我们使用迭代器遍历容器时,有时可能会导致迭代器失效。如果容器的形状或大小发生变化,我们可能会遇到此类问题。在下面的示例中,我们可以识别失效的问题。

示例代码

#include <iostream>
#include <vector>
using namespace std;
int main() {
   vector <int> vec{11, 55, 110, 155, 220};
   for (auto it=vec.begin(); it!=vec.end(); it++)
      if ((*it) == 110)
         vec.push_back(89); //inserting a new value while iterating the vector
      for (auto it=vec.begin();it!=vec.end();it++)
         cout << (*it) << " ";
}

输出

11 55 110 155 220 89 89

在这个程序中,我们可以得到不同类型的结果。这里向量的大小没有预先定义。提供了一些值用于初始化。现在在迭代过程中,我们添加了一个值。在这种情况下,如果向量没有空间,它将在运行时创建一个新的内存块,并且所有项目都将被复制。但是迭代器将指向之前的地址。因此,它可能会产生一些失效。

让我们看看迭代器失效的一些规则。

 
插入
删除
调整大小
向量
所有指向插入点之前的元素的迭代器都不会受到影响,但其他迭代器将失效。如果向量的尺寸增加,则所有迭代器都将失效。
删除点之后的所有迭代器和引用都将失效。
与插入或删除相同。
双端队列
如果插入的项目不是插入到双端队列的末尾,则所有迭代器和引用都将失效。
如果从除末尾位置之外的任何位置删除项目,则所有迭代器都将失效。
与插入或删除相同。
列表
所有迭代器和引用都不会受到影响
只有那些指向将被删除的元素的迭代器或引用才会受到影响。
与插入或删除相同。
集合、映射、多重集合、多重映射
所有迭代器和引用都不会受到影响
只有那些指向将被删除的元素的迭代器或引用才会受到影响。
----

更新于: 2019年7月30日

1K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.