这是关于一个普通双非本科大一学生的C++的学习记录贴
在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料
那么开启正题
今天分享的是关于vector,这篇博客内容紧跟上一篇
1.迭代器失效
2.删除型
我们来看下面的代码
void Test1()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
v.erase(it);
}
else
{
++it;
}
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
}
思路是用迭代器遍历vector删除偶数数据,看起来也没什么问题,但是运行起来会发现程序崩溃了,这是因为删除之后再走到while条件判断使,vs编译器会检测出来迭代器失效了,终止程序(注意这件事情是编译器做的,有的编译器不会做这样的事情,比如gcc)
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效 了。
要改也很简单,我们回顾erase这个函数,他删除pos位置的数据,并且会返回删