在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
在此程序中,我们可以获得不同种类的结果。在此,向量的大小没有更早定义。提供了一些用于初始化的值。现在,在迭代的同时,我们又增加了一个值。在这种情况下,如果向量没有空间,它将在运行时创建一个新的内存块,并且所有项目都将被复制。但是迭代器将指向先前的地址。为此,它可能会导致一些无效。
让我们看看迭代器失效的一些规则。
| 插入 | 删除 | 调整大小 |
---|---|---|---|
向量 | 指向插入点之前的元素的所有迭代器均不受影响,但其他迭代器则无效。并且如果向量的大小增加,则所有迭代器都将失效。 | 删除点之后的所有迭代器和引用均无效。 | 与插入或擦除相同。 |
双端队列 | 如果插入的项未在双端队列的末尾插入,则所有迭代器和引用均无效。 | 如果从结束位置以外的任何位置删除了项目,则所有迭代器将失效。 | 与插入或擦除相同。 |
列表 | 所有迭代器和引用均不受影响 | 仅那些指向将要删除的元素的迭代器或引用受到影响。 | 与插入或擦除相同。 |
集,图,多集,多图 | 所有迭代器和引用均不受影响 | 仅那些指向将要删除的元素的迭代器或引用受到影响。 | ---- |