这是关于一个普通双非本科大一学生的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位置的数据,并且会返回删除后位置的值,所以我们的代码改成下面的写法即可
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){it = v.erase(it); //变化在这里}else{++it;}}for (auto e : v){cout << e << " ";}cout << endl;
}
3.其他型
在实际运用中我们还会遇到很多其他情况的迭代器失效情况,为了减少这种错误,我们在使用vector时就需要提前考虑会不会出现迭代器失效,并且想好怎么避免,以及如何解决,例子是举不完的,要我们在实际运用中学习才能更好的理解
新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!