请问为什么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是一个连续存储的容器,可以通过迭代器的自增操作直接指向要删除的元素位置。