#include <iostream>
//非序列式容器
#include <set>
#include <map>
#include <list>
//序列式容器
#include <vector>
#include <deque>
using namespace std;
int main()
{
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(5);
vec.push_back(6);
vec.push_back(3);
vec.push_back(5);
cout << vec.size() << endl;
for(auto it = vec.begin(); it != vec.end(); ++it)
{
if(*it == 5)
{
vec.erase(it);
}
}
for(auto data : vec)
{
cout << data << " ";
}
cout << endl;
system("pause");
return 0;
}
起始:first = 0x03025928 last = 0x03025940 即相差24个字节 刚好6个元素
接着 auto it = vec.begin() ptr = 0x03025928
判断条件 *it == 5 ,不满足
执行++it; ptr = 0x0302592C
判断条件 *it == 5 ,不满足
执行++it; ptr = 0x03025930
判断条件 *it == 5 ,满足
执行vec.erase(it)操作,执行完成后,继续执行++it,应用程序崩溃
结论:对于序列式容器vector,deque来说,使用erase方法删除迭代器后,
后续的迭代器都会失效,即我们无法对其进一步操作。
序列式容器
for(auto it = vec.begin(); it != vec.end(); )
{
if(*it == 5)
it = vec.erase(it);
else
++it;
}
解决方案
int y = 5;
推荐写法
deq.erase(std::remove_if(deq.begin(), deq.end(), [y](int x)->bool {return x == y; }), deq.end());