c++ stl adjacent_find问题

img

请问为什么后一个人的信息打印不出来只有前一个人的


void test02()
{
    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());
    cout << "相邻重复元素姓名为" << it->m_Name<<" " <<"年龄为"<<it->m_Age<< endl;
    cout << "相邻重复元素姓名为" <<( it+1)->m_Name<<" " <<"年龄为"<<(++it)->m_Age<< endl;
}

问题出在以下这行代码:

cout << "相邻重复元素姓名为" <<( it+1)->m_Name<<" " <<"年龄为"<<(++it)->m_Age<< endl;

在这里,你先使用 (it+1)->m_Name 访问了 it+1 指向的 Person 对象的姓名,然后通过 ++itit 指向了下一个 Person 对象,再访问了其年龄。这样的操作是不正确的,因为在 ++it 之前,it 已经指向了下一个元素,而不是当前元素的下一个元素。因此,你访问的是当前元素的下一个元素的姓名和年龄,而不是相邻重复元素的姓名和年龄。

为了解决这个问题,你可以使用 it 的拷贝来访问当前元素和下一个元素,例如:

vector<Person>::iterator it = adjacent_find(v.begin(), v.end());
cout << "相邻重复元素姓名为" << it->m_Name << " " << "年龄为" << it->m_Age << endl;
cout << "相邻重复元素姓名为" << (it+1)->m_Name << " " << "年龄为" << (it+1)->m_Age << endl;

这样,你就可以正确地访问相邻重复元素的姓名和年龄了。