参考书籍:《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_differencestl_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 算法的两个版本源代码如下,其中 code01code02 为该算法的两个外部调用接口,code03code04 为内部函数,其实可以不用提供:

// 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;
}

code01code02 中使用的 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 可以看出,上一次计算的结果不会对下一次计算产生影响,因为每一次计算的操作数,都被存放在 valuetmp 当中,操作数据全部使用的是原始数据。
  • 由代码分析,该函数中的 result 也可以为当前容器,也就是 result 可以等于 first,也就是说,该函数是一个质变函数。

数值算法 —— 邻接元素操作(adjacent_difference)相关推荐

  1. 48 jQuery元素操作

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 主要是遍历.创建.添加.删除元素操作. 1.遍历元素 jQuery隐式迭代是对同一类元素做 ...

  2. jQuery 元素操作——遍历元素

    jQuery 元素操作 主要是遍历.创建.添加.删除元素操作 <!DOCTYPE html> <html lang="en"><head>< ...

  3. jQuery元素操作

    1.1   元素操作 1.1.1    高度和宽度 $("div").height();            // 高度 $("div").width();  ...

  4. Selenium2(WebDriver)总结(五)---元素操作进阶(常用类)

    Selenium2(WebDriver)总结(五)---元素操作进阶(常用类) 1.Alert类 Alert是指windows弹窗的一些操作,需要new一个Alert类 driver.switchTo ...

  5. [Python]两个list对应元素操作(相减)

    两个list的对应元素操作,这里以相减为例: # coding=gbkv1 = [21, 34, 45] v2 = [55, 25, 77]#v = v2 - v1 # Error: TypeErro ...

  6. jQuery中的元素操作

    jQuery元素操作 通过jQuery可以操作控制元素的样式,文本,属性等 jquery样式操作 css操作行内样式 // 获取div的样式 $("div").css(" ...

  7. layui 如何去dom_常用元素操作 - layui.element

    元素功能的开启只需要加载element模块即会自动完成,譬如tab选项卡切换.导航菜单滑动切换效果.面包屑导航.进度条等,使用这些小交互功能的前提就是:拥有符合这些小功能的所需正确的HTML结构,以及 ...

  8. PTA8、列表偶数位置的元素操作 (10 分)

    8.列表偶数位置的元素操作 (10 分) 输入一个整数列表,将列表中的偶数位置的元素进行加3后,再求和并输出 输入格式: 输入一个整数列表,如[1,2,3]. 输出格式: 输出列表中元素求和的值,如9 ...

  9. Tensor:逐元素操作

    逐元素操作 这部分操作会对tensor的每一个元素(point-wise,又名element-wise)进行操作,此类操作的输入与输出形状一致.常用的操作如表3-4所示. 表3-4: 常见的逐元素操作 ...

  10. 大数据清洗2(元素操作)

    元素操作 一.访问ndarray中的元素--索引和切片 1.基本索引和切片 1.1 一维数组的索引和切片 1.2 高维数组的基本索引和切片 2.高级索引 2.1 整数数组索引和切片 2.2 布尔索引 ...

最新文章

  1. matlab adc仿真,[转载]关于ADC仿真做FFT的设置和结果分析
  2. DropDownList选中值,不存在的时候不出错的写法
  3. linux系统怎么安装pr,Linux安装后的配置
  4. 父亲节,来认识一下这几位“爸爸”
  5. CART决策树算法的Python实现(注释详细)
  6. mcafee杀死oracle,【搬运】跟客服要来的迈克菲卸载工具,拯救你的笔记本
  7. 高分三号卫星相关知识
  8. ae插件form_四分钟了解全网最受欢迎的10大AE插件
  9. java获取登录内网ip地址
  10. 程序员,对自己好一点
  11. access网格线方向微为垂直_设置ACCESS2010背景和网格线
  12. (综述)微信聊天记录导出制作年度报告方法和相关软件
  13. cache stm32h7_【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)
  14. 关于chrome、edge浏览器f12开发者模式的application中无法添加参数的问题
  15. tabbar模板html,新闻手机模板,html模板,小程序模板,App模板
  16. JAVA后端开发必备软件(仅供参考)
  17. EIGRP协议(NA、NP知识点)
  18. 软件开发中的角色分工
  19. RGB和HSV颜色空间
  20. 银河麒麟踩坑笔记——tty、单用户模式

热门文章

  1. python多条件判断筛选数据_Python实现多条件筛选目标数据功能【测试可用】
  2. PHP格式化 插件 vs code
  3. Android添加大图通知栏消息
  4. 5 个最好的免费开源反病毒工具(PC版)
  5. edge bing搜索响应缓慢
  6. 【数字IC验证】1-systemverilog数据类型
  7. python通过线程实现定时器timer的方法
  8. 刚刚地震了,怎么办?
  9. CMM---软件能力成熟度模型
  10. selenium+python自动化84-chrome手机wap模式(登录淘宝页面)