1.概念
迭代器的底层实际上是一个指针,或者是对指针进行了封装。迭代器失效,实际上就是迭代器对应地址的空间已经释放,但我们仍然去使用,导致程序崩溃。
2.引发底层空间的改变,可能会使迭代器失效(插入数据,reverse,resize都有可能)
例如当我们运行下面的代码时就会报错
vector<int> v1(10, 5);
cout << v1.capacity() << endl;//v1的容量就是10
auto it = v1.begin();
v1.push_back(6);//此时插入就会扩容,就有空间的转移,之前的it就会失效
while (it != v1.end())
{
cout << *it << " ";
it++;
}
string s1("claus hello");
cout << s1.capacity();//容量为15
auto it = s1.begin();
s1.reserve(16);//此时空间迁移了,it已经失效了
while (it != s1.end())
{
cout << *it << " ";
it++;
}
3. erase删除元素后
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
v1.push_back(7);
//例如我要删掉v1中的全部偶数
auto it = v1.begin();
while (it!= v1.end())
{
if (*it % 2 == 0)
{
v1.erase(it);//erase it位置后,后面的元素会补上来
}
it++;//这里++it就会导致漏查,或者结尾的时候会越界。但是由于vs的检查第一次删除后++就会报错
}
4.解决办法
在迭代器失效后对it重新赋值即可解决问题。
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
v1.push_back(7);
//例如我要删掉v1中的全部偶数
auto it = v1.begin();
while (it!= v1.end())
{
if (*it % 2 == 0)
{
it = v1.erase(it);
}
else
{
it++;
}
}