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

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

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

 
插入
删除
调整大小
向量
指向插入点之前的元素的所有迭代器均不受影响,但其他迭代器则无效。并且如果向量的大小增加,则所有迭代器都将失效。
删除点之后的所有迭代器和引用均无效。
与插入或擦除相同。
双端队列
如果插入的项未在双端队列的末尾插入,则所有迭代器和引用均无效。
如果从结束位置以外的任何位置删除了项目,则所有迭代器将失效。
与插入或擦除相同。
列表
所有迭代器和引用均不受影响
仅那些指向将要删除的元素的迭代器或引用受到影响。
与插入或擦除相同。
集,图,多集,多图
所有迭代器和引用均不受影响
仅那些指向将要删除的元素的迭代器或引用受到影响。
----