c++新手求教有关问题,望解决

c++新手求教问题,望解决
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <list>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
vector<int> ivec(ia, ia + 11);
list<int> ilist(ia, ia + 11);
for(list<int>::iterator lit = ilist.begin(); lit != ilist.end(); ++lit){
if(*lit % 2 != 0){
lit = ilist.erase(lit);
--lit;
}
}
for(vector<int>::iterator vit = ivec.begin(); vit != ivec.end(); ++vit){
if(*vit % 2 == 0){
vit = ivec.erase(vit);
--vit;
}
}

return 0;
}
c++新手求教有关问题,望解决
------解决思路----------------------
这里有问题

if(*vit % 2 == 0){
vit = ivec.erase(vit);
--vit;
}

第一个元素erase之后,vit指向第一个元素,再做--操作就会断言失败。
------解决思路----------------------
vit = ivec.erase(vit);  这一句之后,迭代器就指向下一个了,不用再减减了。
尤其是迭代器指向第一个的时候,再减减就变无效了,你这里数据的第一个就是0,能进这个if,所以报错
------解决思路----------------------

#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main()
{
int ia[] = { 0, 1, 5, 2, 3, 5, 8, 13, 21, 55, 89 };
vector<int> ivec(ia, ia + 11);
list<int> ilist(ia, ia + 11);
for(list<int>::iterator lit = ilist.begin(); lit != ilist.end(); ++lit){
if(*lit % 2 != 0){
lit = ilist.erase(lit);
--lit;
}
}
for(list<int>::iterator lit = ilist.begin(); lit != ilist.end(); ++lit){
cout<<*lit<<"\t";
}
cout<<endl<<endl;

for(vector<int>::iterator vit = ivec.begin(); vit != ivec.end(); ++vit){
if(*vit % 2 == 0){
vit = ivec.erase(vit);
//vit--;
}
}
for(vector<int>::iterator vit = ivec.begin(); vit != ivec.end(); ++vit){
cout<<*vit<<"\t";
}
cout<<endl;
return 0;
}

我在vs2010上试了一下,上面是我试的程序。
我再问一下:为啥list<int>::iterator lit需要减减,而vector<int>::iterator vit 不需要???
引用:
vit = ivec.erase(vit);  这一句之后,迭代器就指向下一个了,不用再减减了。
尤其是迭代器指向第一个的时候,再减减就变无效了,你这里数据的第一个就是0,能进这个if,所以报错

------解决思路----------------------
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.

执行erase后,返回的vit指向被删除迭代器的下一个。