STL容器中的erase函数调用问题
自我感觉,erase函数返回一个迭代器,指向被删除元素的下一个位置,不是很合理。
啥也不说,直接上代码:
int findNum = 2;
int array[] = { 1, 2, 2, 4, 5, 6 };
vector<int> ivec(array, array + sizeof(array) / sizeof(*array));
for (vector<int>::iterator iter = ivec.begin(); i != ivec.end(), iter++)
{
if (*iter == findNum)
{
iter = ivec.erase(iter);
continue;
}
else
{ }
}
这段代码,看似没有问题,实则,iter重新赋值之后,然后再次++,会跳过一个元素,在这个例子中,就是第三个元素2会被跳过。
换个条件,把要查找的元素由2改为6会发生什么,死循环了或者直接崩了,其中道理不言而喻,continue之后iter已经是等于end()了,然后再次++,会指向end()之后的位置,这个位置是非法的。
第一步,在continue之前,加上iter--
只对了一半,试着把查找元素换成1,会出现什么问题呢,iter--会崩溃。
所以,还需要增加一个判断:
if(iter != ivec.begin()) iter--;
这个问题也可以将for循环的循环递增语句iter++从头部移到循环体中,在else中进行++操作。