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的更多相关文章
随机推荐
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
- 华为ap3010DN-V2刷出胖AP并配置接入POE交换机实现上网
配置FAT AP二层组网示例 组网图形 图1 配置二层网络WLAN基本业务示例组网图 组网需求 如图1所示,FAT AP通过有线方式接入Internet,通过无线方式连接终端.现某企业分支机构为了保证 ...
- Git回滚代码到某个commit
回退命令: $ git reset --hard HEAD^ 回退到上个版本$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前 $ git rese ...
- 那些好用的Chrome 插件
1. json-viewer 推荐理由:一款Chrome浏览器查看JSON数据自动格式化显示的浏览器插件 https://github.com/tulios/json-viewer
- 【转载】Linux 命令行快捷键 - 移动光标
Linux 命令行快捷键 - 移动光标 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 常用 ctrl+左右键:在单词 ...
- 用ajax下载字节流形式的excel文件
原因:ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的.文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件. 解决方 ...
- Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如00000048)
Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如 ...
- MySQL server has gone away
场景: 批量写入数据时,MySQL server has gone away 解决方法: 在 my.ini 中 将 max_allowed_packet 参数设置大一点 show global va ...
- pytest学习 一
网上有很多这样的资料,学起来还是比较简单,为了将学到的东西应用于工程化,参考这样的样板代码: https://github.com/jeffmacdonald/pytest_test 将其下载到C:\ ...
- Thrift关键字
在编译thrift文件的时候发现报了如下的错误 Cannot use reserved language keyword: "class" 后来查了一下,发现class是thrif ...