本来我是不怎么关注过这个点的,但是今天的一道题把我给难住了,看过答案之后才知道就是因为我对于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的结果