C++ erase()函数使用时的注意点

遇见的场景

删除vector容器指定元素时;

erase()函数的用法

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素。

具体用法如下:

iterator erase(iterator _Where);

删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素

iterator erase( iterator _First, iterator _Last);

删除从_First开始到_Last位置的元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置

erase()函数的注意点

注意1:调用erase()函数之后,vector后面的元素会向前移位,形成新的容器。这样被删除的元素对应的迭代器,此时会变成一个野指针

注意2:删除最后一个元素时,it指向vec.end(),然后会对vec.end()之上执行++操作,从而出现段错误(见上一篇博客)。所以需要加入if判断来避免。

即下述代码为错

for(auto it = vec.begin(); it  !=  vec.end(); ++it){

        if(*it == target)

            vec.erase(it);//此时it变为野指针,而不是指向vec的下一个元素。

}

erase()正确使用方式

for(auto it = vec.begin(); it  !=  vec.end(); ){

        if(*it == target)
    
            it = vec.erase(it);//此时it指向被删除元素的下一个位置。
        else
            it++;

}

或者

for(auto it = vec.begin(); it  !=  vec.end(); ){

        if(*it == target)
            auto it2  = it;
            vec.erase(it2);//此时it指向被删除元素的下一个位置。
        else
            it++;

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容