码迷,mamicode.com
首页 > 其他好文 > 详细

STL容器中的erase函数调用问题

时间:2015-10-26 18:23:22      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

自我感觉,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中进行++操作。

STL容器中的erase函数调用问题

标签:

原文地址:http://www.cnblogs.com/GlenWang/p/4911721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!