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 ))。
adjacent_diffenerce的更多相关文章
随机推荐
- adb shell 命令详解
adb介绍 SDK的Tools文件夹下包含着Android模拟器操作的重要命令adb,adb的全称为(Android Debug Bridge就是调试桥的作用.通过adb我们可以在Eclipse中方面 ...
- grid - 隐式地命名网格区域名称
通常可以将网格线命名成任何你想命名的名称,如果网格线名称添加-start和-end的后缀,其实也隐式的创建一个网格区域,可以用来设置网格项目的位置. 在这个示例中,行和列都具有inner-start和 ...
- 通过Comparable来实现对自身的比较
import org.apache.commons.lang.builder.CompareToBuilder; import org.apache.commons.lang.builder.Equa ...
- oracle无效索引重建
问题描述: 执行失败!错误信息[Exception message:无效的列索引 解决思路: 分析是表索引,大部分都是表索引失效导致的,只需要花重建表索引即可! 00.查看此表归属账户select * ...
- 【C++】解析C++运行环境的搭建
在本篇文章中,笔者会谈谈如何搭建C++的运行环境.在不同操作系统中,运行C++编译器的命令也各不相同,最常用的编译器是GNU编译器(Linux系统)和微软Visual Studio编译器(Window ...
- c#异常重试机制
有时候我们碰到程序异常了,想让程序继续重新执行,进行重试,这时候就需要有一个合适的方法来进行操作: 自己写代码控制太麻烦了,也容易出错.这时候当然是站在巨人的肩膀上, https://github.c ...
- AngularJS判断checkbox/复选框是否选中并实时显示
最近做了一个选择标签的功能,把一些标签展示给用户,用户选择自己喜欢的标签,就类似我们在购物网站看到的那种过滤标签似的: 简单的效果如图所示: 首先看一下html代码: 1 <!DOCTYPE h ...
- MVC5 IIS7 403错误
问题背景 MVC5部署到IIS7中显示403错误. 解决方案 <system.webServer> → <modules> 节点下的 ApplicationInsightsWe ...
- 突破这个四个阶段年薪没有50W,还好意思说是搞Java的?
该视频教程总共分为四个阶段来学习.逐步进阶,并且还会不定期更新.我简介一下每一个阶段的视频资源,学习顺序不分先后. 第一阶段 第一阶段主要从 svn/git 版本号控制.Java高并发.JVM虚拟机. ...
- GridView不执行RowCommand事件
web.config里把viewstate禁用了.如果是的话在页面里单独开起来就好了. <%@ Page Title="" Language="C#" M ...