zoukankan      html  css  js  c++  java
  • adjacent_diffenerce

    版本1:

    template <class InputIterator,class OutputIterator>
    OutputIterator adjacent_diffenerce(InputIterator first, InputIterator last, OutputIterator result)
    {
        if(first == last)
            return result;
        *result = *first;//首先记录第一个元素
        return __adjacent_diffenerce(first, last, result, value_type(first));
        //但是以上操作可以不需要传递调用,可以改用以下写法(整个函数):
        //if (first == last) return result;
        //*result = *first;
        //iterator_traits<InputIterator>::value_type value = *first;
        //while (++first != last) //走过整个区间 
        //{…以下同 __adjacent_diffenerce的对应内容 
    }
    
    template <class InputIterator, class OutputIterator, class T>
    OutputIterator __adjacent_diffenerce(InputIterator first, InputIterator last, OutputIterator result, T*)
    {
        T value = *first;
        while (++first != last)
        {
            T tmp = *first;
            *++result = tmp - value;
            value = tmp;
        }
        return ++result;
    }

    版本2:

    template <class InputIterator,class OutputIterator, class BinaryOperation>
    OutputIterator adjacent_diffenerce(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op)
    {
        if(first == last)
            return result;
        *result = *first;//首先记录第一个元素
        return __adjacent_diffenerce(first, last, result, value_type(first), binary_op);
    }
    template <class InputIterator, class OutputIterator, class T, class BinaryOperation >
    OutputIterator __adjacent_diffenerce(InputIterator first, InputIterator last, OutputIterator result, T*, BinaryOperation binart_op)
    {
        T value = *first;
        while (++first != last)
        {
            T tmp = *first;
            *++result = binary_op(tmp, value);//将相邻两元素的运算结果,赋值给目的端 
            value = tmp;
        }
        return ++result;
    }

      算法 adjacent_difference 用来计算 [first,last)中相邻元素的差额。也就是说,它将 *first 赋值给 *result,并针对 [first+1,last) 内1每个元素的迭代器 i ,将 *i - * ( i - 1 ) 的值赋值给 *( result + ( i - first ) )。

      注意,你可以采用就地 (in place)运算方式,也就是令 result 等于 first。是的,在这种情况下它是一个质变算法。

      “储存第一元素之值,然后储存后继元素之差值”。这种做法很有用,因为这么一来便有足够的信息可以重建输入区间的原始内容。如果加法与减法的定义一如常规定义,那么 adjacent_difference与 partial_sum互为逆运算。这意思是,如果对区间值 1,2,3,4,5 执行adjacent_difference,获得结果为1,1,1,1,1,再对此结果执行partial_sum,便会获得原始区间值1,2,3,4,5。

      第一版本使用 operator-来计算差额,第二版本采用外界提供的二元仿函数。第一个版本针对[first,last)中的每个迭代器 i ,将*i - * ( i - 1 ) 赋值给*( result + ( i - first )),第二版本则是将binary_op( * i, *( i - 1))的运算结果赋值给 * (result + ( i - first ))。

  • 相关阅读:
    《从0开始学架构》——学习笔记(基础篇和高性能篇)
    Oracle的数据并发与一致性详解(下)
    Oracle的数据并发与一致性详解(上)
    关于oracle的缓冲区机制与HDFS中的edit logs的某些关联性的思考
    分布式锁的两种实现方式(基于redis和基于zookeeper)
    hadoop配置文件详解系列(二)-hdfs-site.xml篇
    hadoop配置文件详解系列(一)-core-site.xml篇
    【管理心得之四十六】你呀,少肺
    【管理心得之四十五】你呀,没心
    【管理心得之四十四】独立冲突之外,你做不到
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8321290.html
Copyright © 2011-2022 走看看