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中进行++操作。

posted @ 2015-10-26 16:58  GlenWang  阅读(176)  评论(0编辑  收藏  举报