vector的remove和erase函数的区别

首先我们先来看一下两个函数

iterator erase(iterator position);

iterator erase(iterator first, iterator last);

erase:
erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器。
在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。其实vector还维持着一个last指针,开始的时候=end,随着删除,last前移,最终vector的size是last-begin,或者我们可以认为end值改变了,但最初传入的end没有变。

用例:

以上代码是错误的,因为删除一个元素之后,迭代器已经指向了被删除元素的下一个元素,再进行itr++会出现野指针。也就是说veci.erase(iter)后,iter的状态是不确定的,再进行++,岂有不崩溃的道理?!

正确代码为

也就是说如果没有erase操作,再将迭代器指向下一个元素。

删除一段元素后,传入的迭代器指向也是不变的,仍然指向原来传进去时候的位置,修改的是删除段后面的元素的位置。删除段后面的元素都前移了。被删除段用被删除段的下一个元素代替了。

 

remove:
iterator remove(iterator first, iterator last,val);

remove函数会将范围内所有等于val的值移动位置

STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。

vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size。STL和vector这两句表达的意思一样。

执行remove之后返回新的end()迭代器,但是不改变原来数组的end()迭代器的值,将范围内值等于val的元素用后一个元素替代。也就是原先数组中新的end()至原end()范围内的值仍为原来数组的值(等于val的值),但是这部分状态不可靠。begin()到新的end()这部分是不等于val的值。

区别:

也就是说erase和remove的区别在于执行函数之后返回值不同,被执行的vector的大小会不会改变

vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。

vector中remove的作用是将范围内为val的值都remove到后面,返回新的end()值(非val部分的end),但传入的原vector的end并没有发生改变,因此size也就没有变化

两者结合应用:
删除vector中值为x的元素

vec.erase(remove(vec.begin(),vec.end(),x),vec.end());

具体可参见leetcode26

重复元素只保留一个,对重复的原地移除。

思路:可以将重复的元素用一个特殊值替代,再统一删除这个特殊值。

转自:https://blog.csdn.net/xzymmd/article/details/83652726

发表回复