zoukankan      html  css  js  c++  java
  • 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,那确实是直接删除了。或许,那“移除元素”是指的这个版本?
     
  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/xiarl/p/3483513.html
Copyright © 2011-2022 走看看