本来我是不怎么关注过这个点的,但是今天的一道题把我给难住了,看过答案之后才知道就是因为我对于erase接口使用的不了解造成的,所以特意把这道题拿出来说一下
题目要求是给出以下代码的输出结果:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> a;
a.push_back(100);
a.push_back(300);
a.push_back(300);
a.push_back(300);
a.push_back(300);
a.push_back(500);
auto it = a.begin();
for (; it != a.end(); it++){
if (*it == 300){
it = a.erase(it);
}
}
for (it = a.begin(); it != a.end(); it++){
cout << *it << ' ';
}
return 0;
}
第一遍看过去的时候以为正确答案是 100 500 结果答案却是100 300 300 500 这让我百思不得其解,最后发现问题出现在erase的返回值上!
erase再删除当前位置内容后会返回下一个位置的迭代器,然后再加上循环本身自带的++操作符,整个循环过程一共就会跳过2个位置,所以造成了100 300 300 500的结果