现在的位置: 首页 > 综合 > 正文

erase() 和 remove()

2019年03月25日 ⁄ 综合 ⁄ 共 1553字 ⁄ 字号 评论关闭
remove():
这个remove是STL库里面的函数,原型如下:
Eliminates a specified value from a given range without disturbing the order of the remaining elements and returning the end of a new range free of the specified value.

template<class ForwardIterator, class Type>
   ForwardIterator  remove(
      ForwardIterator _First, 
      ForwardIterator _Last, 
      const Type& _Val
   );
参数说明如下:
_First
A forward iterator addressing the position of the first element in the range from which elements are being removed.
_Last
A forward iterator addressing the position one past the final element in the range from which elements are being removed.
_Val
The value that is to be removed from the range.
返回值:迭代器ForwardIterator,指向操作后第一个被排除的值
        eg.array={1,6,6,3};
	   itor = remove(array.begin(),array.end(),6);//排除值为6的元素,执行操作后的结果:1,3,6,3,看来remove()的思路是把不符							合条件的元素值(非6)向前提
	   cout<<*itor<<endl;//结果:6		     
功能
移除[first, last)范围内等于val的元素。
但这个函数只是把val移到vec的末尾,并不真正删除

remove函数是不会真正删除任何东西的,remove只会把你想留下的元素放到集合的最前面,但是remove过以后集合的大小是不会变的。所以你真的要删东西还是要用集合的erase函数。

erase():

原型:

(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是说有三种用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处以后的所有字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器

返回值:

未被删除的第一个元素的iterator


【转自wangwenwen】注:
1、条款44指出,对于list,调用remove成员函数比应用erase-remove惯用法更高效。

2、有两种“类似remove”的算法:remove_if和unique。

remove和remove_if之间的相似性很直截了当。所以我不会细讲,但unique行为也像remove。它用来从一个区间删除东西(邻近的重复值)而不用访问持有区间元素的容器。结果,如果你真的要从容器中删除元素,你也必须成对调用unique和erase,unique在list中也类似于remove。正像list::remove真的删除东西(而且比erase-remove惯用法高效得多)。list::unique也真的删除邻近的重复值(也比erase-unique高效)。

抱歉!评论已关闭.