c++ stl adjacent_find删除相邻元素

img

请问为什么test03用v.erase(++it);test04却用 v.erase(it+1)?
我想设计一个删除相邻元素中的后一个元素的功能


void test03()
{
    //字符串 
    vector<char>v;
    for(int i=0;i<10;i++)
    {
        v.push_back('a');
        v.push_back('b');
        v.push_back('b');
        v.push_back('c');
        if(i<5)
        {
            v.push_back('d'); 
        }
    }
    for_each(v.begin(),v.end(),myPrint);cout<<endl;
    
    vector<char>::iterator it=adjacent_find(v.begin(),v.end());
    for( ;it!=v.end();it++)
    {
        it=adjacent_find(v.begin(),v.end());
        if(it!=v.end())
        {
            v.erase(++it);                 
        } 
    }
    for_each(v.begin(),v.end(),myPrint);cout<<endl;
}

void test04()
{
    //Person容器 
    vector<Person>v;
    char nameSeed[3][2] = { "A","B","C" };
    srand((unsigned int)time(NULL));

    for (int i = 0; i < 3; i++)
    {
        int age = rand() % 100 + 1;
        v.push_back(Person((const char*)nameSeed[i], age));
    }
    v.push_back(Person("C", 0));
    
    for_each(v.begin(), v.end(),MyPrint());
    
    

    vector<Person>::iterator it = adjacent_find(v.begin(), v.end());

    for( ;it!=v.end();it++)
    {
        it=adjacent_find(v.begin(),v.end());
        if(it!=v.end())
        {
            v.erase(it+1);                 
        } 
    }
    for_each(v.begin(),v.end(),MyPrint());cout<<endl;
}

正确代码


    vector<Person>::iterator it = adjacent_find(v.begin(), v.end());

    for( ;it!=v.end();it++)
    {
        it=adjacent_find(v.begin(),v.end());
        vector<Person>::iterator it2=it;
        if(it!=v.end())
        {
            v.erase(++it2);                 
        } 
    }

存储的对象类型不同。
test4中vector中的元素是复杂对象,对象之间存储的位置不一定是连续的,所以无法直接通过迭代器的自增操作来定位要删除的元素位置。相反,需要通过迭代器的算术运算来获取要删除元素的位置。而test3的vector是一个连续存储的容器,可以通过迭代器的自增操作直接指向要删除的元素位置。