Vector的迭代器 失效问题
1.erase insert 使用后会导致原来的迭代器失效,
#include<iostream>
using namespace std;
#include<vector>
void VectorTest()
{
vector<int> vec;
for (int i = 0; i < 5; i++)
{
vec.push_back(i);
}
vector<int>::iterator it;
cout << sizeof(it) << endl;
for (it = vec.begin(); it != vec.end(); it++)
{
if (*it>2)
vec.erase(it);//此处会发生迭代器失效
}
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
}
int main()
{
VectorTest();
system("pause");
return 0;
}
解决办法:更新迭代器
void VectorTest()
{
vector<int> vec;
for (int i = 0; i < 5; i++)
{
vec.push_back(i);
}
vector<int>::iterator it;
cout << sizeof(it) << endl;
for (it = vec.begin(); it != vec.end(); )
{
if (*it==3)
{
it = vec.erase(it);//更新迭代器it
}
it++;
}
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
}
vector迭代器失效问题总结 insert erase push_back等操作之后的迭代器完全失效,该迭代器iter不能参与任何运算,包括iter++,*iter
(1)当执行erase方法时,指向删除节点的迭代器全部失效,指向删除节点之后的全部迭代器也失效,erase方法的返回值来获取下一个有效的迭代器
(2)当进行push_back()方法时,end操作返回的迭代器肯定失效。
(3)当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。
(4)当插入(push_back)一个元素后,如果空间未重新分配,指向插入位置之前的元素的迭代器仍然有效,但指向插入位置之后元素的迭代器全部失效
