使用vector.erase()删除一个元素时遇到的一个有关问题

【求助】使用vector.erase()删除一个元素时遇到的一个问题
写了一个小代码玩,想要删除vector中的奇数值。
C/C++ code

int main()

{
    int ia[]={0,1,3,2,3,5,8,13,21,55,89};
    vector<int> vec (ia,ia+11);
    vector<int> ::iterator iter, first;
    /ector<int>::iterator temp;

    /*first = find(vec.begin(),vec.end(),5);
    last = find(vec.begin(),vec.end(),13)
    vec.erase(first,last);*/
    
    first=vec.begin();

        //写法1、这样会出错
    while(first != vec.end())
    {
        if ((*first) % 2 != 0)
        {
            vec.erase(first);    //这样写就会出现错误
            continue;
        }
        first=first+1;
        
    }


    /*写法2、这样不会出错
    while(first != vec.end())
    {
        if ( (*first)%2 != 0)
        {
            first = vec.erase(first);  //换成这种写法就不会发生错误
            continue;
        }
        first++;
    }
    
    */

    for (iter = vec.begin(); iter != vec.end(); iter++)
    {
        cout << *iter << endl;
    }

}



出错的情况是这样的,当我删掉第一个奇数值1之后,我看到first指向的值变成了3,continue语句跳转到while语句后再判断就报错了。

然后。。。。。。
我查了STL源码剖析,里面erase操作的源码是
C/C++ code

iterator erase(iterator position)
{
     if (position + 1 != end())
         copy(position + 1, finish, position);
     --finish;
     destory(finish);
     return position;
}



这里我就感觉很奇怪了,源码中返回的position就是一个指向原先vector下一个值的地址,为什么写法1中就存在错误,而写法2就没有错误。而且调试的时候,我也看到first指向了下一个值。为什么就出现错误了。。。

个人感觉应该不是指向地址的问题。可能是iterator内部实现机制的问题。。但是没查到相关资料

求指导。。。。。。

第一次发帖,不知道这样说明够不够准确

------解决方案--------------------
google "迭代器失效"