• 【翻译】std::remove


      函数模板

      std::remove                    头文件<algorithm>

    template <class ForwardIterator, class T>
      ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);

       从一个范围中删除某值

      [注释:本文是 std::remove 算法的参考手册,关于 <cstdio.h> 头文件下的 remove 函数,请参见:http://www.cplusplus.com/reference/cstdio/remove/]

      对范围 [first , last ) 进行转换(transform),移除其中所有与 val 相等的元素,返回一个指向新范围的 end 的迭代器。

      (译注:transform 是 STL 的一个算法,不知道 std::remove 的底层是否经由 std::transform 实现。)

      函数不改变所包含的“范围对象”的属性(换句话说,函数不改变数组或者容器的真实 size ):元素被移动是通过下一个不等于 val 的元素,来替换当前等于 val 的元素,而且会通过返回一个指向新 end 的迭代器,来指示出新的稍“短”一些的范围(返回的迭代器所指向的元素是新的 past-the-end 元素)。

      元素间的顺序不会改变。介于返回的迭代器和 last 迭代器间的元素仍然有效,但是状态是未定义的。

      函数使用 operator== 来逐个比较元素与 val 是否相等。 

       C++11下或如何实现

      元素的替换通过 move-assigning 一个新值来实现。

      可能通过如下函数模板来实现:

     1 template <class ForwardIterator, class T>
     2   ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
     3 {
     4   ForwardIterator result = first;
     5   while (first!=last) {
     6     if (!(*first == val)) {
     7       *result = move(*first);
     8       ++result;
     9     }
    10     ++first;
    11   }
    12   return result;
    13 }

      函数形参

      # first,last

      指向 move-assignable 序列首部和尾部的前向迭代器,用它们来支持元素和类型为 T 的值进行比较。迭代器指向的范围是 [ first, last ),这包括了 first 和 last 之间—— first 所指向的元素和 last 之前的元素。

      # val

      将被移除的元素的值。

      返回值

      一个指向最后一个没被移除的元素的迭代器。

      first 和这个迭代器的范围之间,包括了所有不等于 val 的元素。

      使用示例

     1 // remove algorithm example
     2 #include <iostream>     // std::cout
     3 #include <algorithm>    // std::remove
     4 
     5 int main () {
     6   int myints[] = {10,20,30,30,20,10,10,20};      // 10 20 30 30 20 10 10 20
     7 
     8   // bounds of range:
     9   int* pbegin = myints;                          // ^
    10   int* pend = myints+sizeof(myints)/sizeof(int); // ^                       ^
    11 
    12   pend = std::remove (pbegin, pend, 20);         // 10 30 30 10 10 ?  ?  ?
    13                                                  // ^              ^
    14   std::cout << "range contains:";
    15   for (int* p=pbegin; p!=pend; ++p)
    16     std::cout << ' ' << *p;
    17   std::cout << '
    ';
    18 
    19   return 0;
    20 }

      输出:

    range contains: 10 30 30 10 10

      复杂度

      复杂度是与 first 和 last 之间的距离(C++ STL 的函数)线性相关,即函数调用会与每一个元素进行比较,而且可能对其中的一些元素进行赋值。

      数据簇

      函数会访问、可能修改 [ first , last ) 范围之间的对象。

      异常

      元素比较(element comparisons)时可能抛出异常,元素赋值或者赋值操作作用于迭代器时,可能抛出异常。

      注意,对于无效的参数会造成未定义的行为。

      参阅

      remove_if  

      remove_copy  

      replace

      count

      find

      原文地址:http://www.cplusplus.com/reference/algorithm/remove/

  • 相关阅读:
    英语语法总结---二、英语中的从句是怎么回事
    【Cocos得知】技术要点通常的积累
    政府采购清单应包括“问题” 积
    Ubuntu通过使用PyCharm 进行调试 Odoo 8.0 可能出现的问题
    Android自己定义组件系列【8】——面膜文字动画
    手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发
    OS和android游戏纹理优化和内存优化(cocos2d-x)
    删除重复数据
    MyEclipse2014 设备 checkstyle、PMD、findbugs 最简单的方法 详细说明
    hdu5044 Tree 树链拆分,点细分,刚,非递归版本
  • 原文地址:https://www.cnblogs.com/fengyubo/p/5050880.html
Copyright © 2020-2023  润新知