数值算法 —— 邻接元素操作(adjacent_difference)
参考书籍:《STL源码剖析》
参考源码: cygnus C++2.91.57 for Windows
I. 所在文件位置
// numeric
#ifndef __SGI_STL_NUMERIC
#define __SGI_STL_NUMERIC// ......
#include <stl_numeric.h>
// ......#endif /* __SGI_STL_NUMERIC */
// stl_nameric.h
#ifndef __SGI_STL_INTERNAL_NUMERIC_H
#define __SGI_STL_INTERNAL_NUMERIC_H// ......
// adjacent_difference 函数定义
// __adjacent_difference 函数定义
// ......#endif /* __SGI_STL_INTERNAL_NUMERIC_H */
adjacent_difference
在 stl_numeric.h
文件中实现,但此文件为内部文件,STL 规定,想要使用就必须 #include <numeric>
。
II. 算法测试
/* 测试代码 */
#include <vector>
#include <numeric> // adjacent_difference
#include <functional> // minususing namespace std;int main()
{int ia[5] = { 1, 2, 3, 4, 5 };vector<int> iv(ia, ia + 5);// 此处前两个为目标区域,第三个参数为结果存放位置,该位置既可以为其它容器,也可以为当前容器adjacent_difference(iv.begin(), iv.end(), iv.begin());// result: ia 内容变为 1, 1, 1, 1, 1 返回 iv.end()// 此版本 adjacent_difference 需要用户传入一个二元仿函数对象accumulate(iv.begin(), iv.end(), iv.begin(), plus<int>());// result: 1, 2, 2, 2, 2 返回 iv.end()
}
III. 算法源代码
adjacent_difference
算法的两个版本源代码如下,其中 code01
和 code02
为该算法的两个外部调用接口,code03
与 code04
为内部函数,其实可以不用提供:
// code01
/* 版本一 */
/* 存储第一元素之值,然后存储后继元素之差值 */
template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result) {if (first == last) return result;// 首先记录第一个元素*result = *first;// 调用 代码块03return __adjacent_difference(first, last, result, value_type(first));
}
// code02
/* 版本二 */
/* 和版本一唯一不同的是两个元素不是相减,而是执行执行的仿函数操作 */
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,OutputIterator result,BinaryOperation binary_op) {if (first == last) return result;*result = *first;return __adjacent_difference(first, last, result, value_type(first),binary_op);
}
//code03
template <class InputIterator, class OutputIterator, class T>
OutputIterator __adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, T*) {//用来保存第一个参数T value = *first;while (++first != last) {// 用来保存第二个参数T tmp = *first;// 第一个参数 - 第二个参数*++result = tmp - value;value = tmp;}// 最后返回输出位置的下一个迭代器return ++result;
}
//code04
template <class InputIterator, class OutputIterator, class T, class BinaryOperation>
OutputIterator __adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, T*,BinaryOperation binary_op) {T value = *first;while (++first != last) {T tmp = *first;*++result = binary_op(tmp, value);value = tmp;}return ++result;
}
code01
和 code02
中使用的 value_type
源代码如下:
//code05
/* 用于返回迭代器指向元素数据类型的指针 */
template <class Iterator>
inline typename iterator_traits<Iterator>::value_type*
value_type(const Iterator&) {// 萃取器,对迭代器的类型进行询问,详细内容尽情期待 (^_^)return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
测试代码中使用的 plus
源代码如下:
//code06
/* plus 用于返回两个参数之和 */
template <class T>
struct plus : public binary_function<T, T, T> {T operator()(const T& x, const T& y) const { return x + y; }
};
IV. 算法功能
算法思路图解:
图1 adjacent_difference 算法图示
adjacent_difference
算法的主要功能就是“存储第一个元素之值,然后存储后继相邻元素操作值(默认为相减,当然也可以指定操作方法)”。该函数将第一个元素直接存储,对于 [first+1, last)
内的每一个迭代器 i
,两个函数版本分别执行如下操作:
- 版本一将
*i - *(i - 1)
的值放入*(result + (i - first))
中; - 版本二将
binary_obj(*i, *(i - 1))
的值放入*(result + (i - first))
中;
需要注意的是:
- 由图 1 可以看出,上一次计算的结果不会对下一次计算产生影响,因为每一次计算的操作数,都被存放在
value
和tmp
当中,操作数据全部使用的是原始数据。 - 由代码分析,该函数中的
result
也可以为当前容器,也就是result
可以等于first
,也就是说,该函数是一个质变函数。
数值算法 —— 邻接元素操作(adjacent_difference)相关推荐
- 48 jQuery元素操作
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 主要是遍历.创建.添加.删除元素操作. 1.遍历元素 jQuery隐式迭代是对同一类元素做 ...
- jQuery 元素操作——遍历元素
jQuery 元素操作 主要是遍历.创建.添加.删除元素操作 <!DOCTYPE html> <html lang="en"><head>< ...
- jQuery元素操作
1.1 元素操作 1.1.1 高度和宽度 $("div").height(); // 高度 $("div").width(); ...
- Selenium2(WebDriver)总结(五)---元素操作进阶(常用类)
Selenium2(WebDriver)总结(五)---元素操作进阶(常用类) 1.Alert类 Alert是指windows弹窗的一些操作,需要new一个Alert类 driver.switchTo ...
- [Python]两个list对应元素操作(相减)
两个list的对应元素操作,这里以相减为例: # coding=gbkv1 = [21, 34, 45] v2 = [55, 25, 77]#v = v2 - v1 # Error: TypeErro ...
- jQuery中的元素操作
jQuery元素操作 通过jQuery可以操作控制元素的样式,文本,属性等 jquery样式操作 css操作行内样式 // 获取div的样式 $("div").css(" ...
- layui 如何去dom_常用元素操作 - layui.element
元素功能的开启只需要加载element模块即会自动完成,譬如tab选项卡切换.导航菜单滑动切换效果.面包屑导航.进度条等,使用这些小交互功能的前提就是:拥有符合这些小功能的所需正确的HTML结构,以及 ...
- PTA8、列表偶数位置的元素操作 (10 分)
8.列表偶数位置的元素操作 (10 分) 输入一个整数列表,将列表中的偶数位置的元素进行加3后,再求和并输出 输入格式: 输入一个整数列表,如[1,2,3]. 输出格式: 输出列表中元素求和的值,如9 ...
- Tensor:逐元素操作
逐元素操作 这部分操作会对tensor的每一个元素(point-wise,又名element-wise)进行操作,此类操作的输入与输出形状一致.常用的操作如表3-4所示. 表3-4: 常见的逐元素操作 ...
- 大数据清洗2(元素操作)
元素操作 一.访问ndarray中的元素--索引和切片 1.基本索引和切片 1.1 一维数组的索引和切片 1.2 高维数组的基本索引和切片 2.高级索引 2.1 整数数组索引和切片 2.2 布尔索引 ...
最新文章
- matlab adc仿真,[转载]关于ADC仿真做FFT的设置和结果分析
- DropDownList选中值,不存在的时候不出错的写法
- linux系统怎么安装pr,Linux安装后的配置
- 父亲节,来认识一下这几位“爸爸”
- CART决策树算法的Python实现(注释详细)
- mcafee杀死oracle,【搬运】跟客服要来的迈克菲卸载工具,拯救你的笔记本
- 高分三号卫星相关知识
- ae插件form_四分钟了解全网最受欢迎的10大AE插件
- java获取登录内网ip地址
- 程序员,对自己好一点
- access网格线方向微为垂直_设置ACCESS2010背景和网格线
- (综述)微信聊天记录导出制作年度报告方法和相关软件
- cache stm32h7_【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)
- 关于chrome、edge浏览器f12开发者模式的application中无法添加参数的问题
- tabbar模板html,新闻手机模板,html模板,小程序模板,App模板
- JAVA后端开发必备软件(仅供参考)
- EIGRP协议(NA、NP知识点)
- 软件开发中的角色分工
- RGB和HSV颜色空间
- 银河麒麟踩坑笔记——tty、单用户模式