第一种写法:
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){if (*it != 9999){v.erase(it);}}for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}return 0;
}
该写法存在很大问题,erase函数返回的结果是指向被删除元素的下一个元素的迭代器,在这里:
v.erase(it);
并没有拿我们的迭代器it去接收这个返回值,故执行第一次erase函数,将888删除后,迭代器it的位置就不知道去哪里了,就会报以下错误!
正确写法应该是:
it = v.erase(it);
第二种写法
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){if (*it != 9999){it = v.erase(it);it--;}}for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}return 0;
}
直接报以下错误:
一般人认为因为erase函数返回的结果是指向被删除元素的下一个元素的迭代器,所以用了一个:
it--;
让迭代器it回到原来的位置,但是事实并没有想象中的那么简单!
因为我们不能自以为是的认为vector里的元素就是像数组那样存放,所以你觉得迭代器指向下一个位置后,可以通过it–来回到原来的位置,事实上,它回不去原来的位置,不能直接把迭代器理解成指针,所以不要使用it–。
第三种写法(正确写法)
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::iterator it = v.begin(); it != v.end(); ){if (*it != 9999){it = v.erase(it);}else{it++;}}for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}return 0;
}
观察上面两种图,可以看到我已经删除了几个元素89了,但迭代器的地址竟然都没有发生变化,可以看到vector内部是有优化的,所以不能直观的把vector理解为数组,迭代器理解成指针,所以不要使用it–这样的操作。