目录
1. 会引起其底层空间改变的操作,都有可能是迭代器失效 ,比如: resize 、 reserve 、 insert 、 assign 、push_back等。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector<int> v;
v = { 1,2,3,4,5,6 };
auto it = v.begin();
//使用reserve扩容,可能会引起底层容量的改变,旧空间释放,但是it依旧使用的时释放前的旧空间
v.reserve(100);
while (it != v.end())
{
cout << *it << " ";
++it;
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector<int> v;
v = { 1,2,3,4,5,6 };
//auto it = v.begin();
//使用reserve扩容,可能会引起底层容量的改变,旧空间释放,但是it依旧使用的时释放前的旧空间
//v.reserve(100);
auto it = v.begin();
while (it != v.end())
{
v.erase(it); //删除it位置的数据,导致迭代器失效
//这时再对it进行操作就是非法访问
cout << *it << endl;
++it;
}
return 0;
}
如图中代码,运行会崩溃
erase 删除 pos 位置元素后, pos 位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos 刚好是最后一个元素,删完之后 pos 刚好是 end 的位置,而 end 位置是没有元素的,那么pos 就失效了。因此删除 vector 中任意位置上元素时, vs 就认为该位置迭代器失效了。
如果在删除后对迭代器it重新赋值,这个时候就不会失效,因为erase返回删除元素下一个位置元素的迭代器。
?
可以运行但是结果已经出错。
运行如下代码
可以正常运行,erase删除任意位置代码后,linux下迭代器并没有失效 因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的
但是如果删除的是最后一个元素呢
程序崩溃,因为删除最后一个元素,删除后it已经超过end,++it导致程序崩溃
1.在进行插入或删除操作之后,更新迭代器的位置,使其指向有效的元素。
2.在进行插入或删除操作之前,先将迭代器保存下来,然后再进行操作之后重新定位迭代器。
3.另外,C++11引入了emplace_back()和emplace()函数,它们可以在vector中直接构造对象,而不是先创建临时对象再插入,这样可以减少迭代器失效的可能性?