remove()

看effective stl 第九条,介绍容器中元素的正确删除方式,看到 erase-remove 习惯用法的介绍,然后就看了下remove。参照这教程,做下记述。

通常来说 算法版的remove是为顺序(序列)容器准备的,关于为什么不能用在关联容器上,据说教程的第22条目将有介绍。

而容器 list则另有其自身的方法,当然,我的理解,自身成员方法最大的,其次才是这些高效的标准库算法。

看见一个教程上,给 remove()算法起的名字叫“移除元素”,,那,岂不是和 erase重复了,?

查看网站上的介绍,算法的示例原码如下:

template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!(*first == val)) {
      *result = move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}
这段代码的大致意思,就是一个while循环遍历一遍。遇到符合 remove条件的,就将其用后一个值覆盖掉。具体代码体现是,first一直在递增,而result 只有在值(本身,或是被覆盖了后面的值后)不等于 remove条件的,才会递增。
函数最终返回的是result的最后一个值。所以result通常是等于(没找到需删除值),或小于 end()的。result指向的是取出指定值过后的应当位置,result后面的值已经是无意义的了。通常会将result至end()的删除,即所谓的erase-remove:
c.erase(remove(c.bengin(),c.end(),vvvv), c.end());
 
代码中的 move是11中的,右值引用相关东西。右值引用在cnblog上搜了篇介绍:http://www.cnblogs.com/hujian/archive/2012/02/13/2348621.html
 
测试了下list的成员函数版的remove,那确实是直接删除了。或许,那“移除元素”是指的这个版本?
 
原文地址:https://www.cnblogs.com/xiarl/p/3483513.html