我正在学习C ++,而且我正在阅读有关STL容器,迭代器以及可以对它们执行的操作的内容。 我知道每个容器类型(或者更好,每个类型都是实例的相应模板)定义了一个类似于指针类型的companio类型,它被称为迭代器。我理解的是,一旦你得到一个容器的迭代器,执行像添加元素之类的操作可能会使该迭代器失效,所以我尝试用一个例子来测试这个语句:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> ivec={1,2,3,4,5,6,7,8,9,0};
auto beg=ivec.begin();
auto mid=ivec.begin()+ivec.size()/2;
while (beg != mid) {
if (*beg==2)
ivec.insert(beg,0);
++beg;
}
for (auto i:ivec)
cout<<i<<" ";
}
这里,我只是简单地构造一个int向量,大括号初始化它,并执行一个基于条件的操作,在容器的前半部分插入一个元素。
我认为代码存在缺陷,因为我正在初始化两个迭代器对象beg
和end
然后我在while语句中使用它们作为条件。
但是,如果代码应该更改容器的内容(并且确实如此)迭代器会发生什么?
代码似乎运行得很好,它在ivec [1]位置添加0并打印结果。
我认为beg
迭代器会指向新添加的元素,而mid
迭代器会指向前一个指向中间的元素(它是&#39; s就像迭代器指向相同的内存位置,而底层数组,#34;滑动&#34;下...除非重新分配,否则就是
有人可以解释一下这种行为吗?
答案 0 :(得分:5)
当标准说迭代器失效时,这并不能保证它们 在防止程序运行的意义上无效。使用无效的迭代器是未定义的行为,这是C ++中一个非常重要的主题。这并不意味着你的程序会崩溃,但它可能会崩溃。您的程序可能还会执行其他操作 - 行为完全未定义。