SGISTL源码探究-stl_numeric.h中的数值算法

什么是Claude 的 Agent Skills? 摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。 阅读详情

前言

上一小节中,我们对stl中的算法部分做了一个大致的说明。本小节我们将进入到其中关于数值算法的部分,都在stl_numeric.h文件中。废话不多说,直接看源码吧。

stl_numeric

accumulate

注意该算法要求了迭代器的类型至少是InputIterator类型,如果是OutputIterator类型,肯定是不行的。
用于计算元素总和,init加上[first, last)范围内的元素之和。

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init) {
  /* 将[first, last)的值累加到init上
   * 最后返回结果
   */
  for ( ; first != last; ++first)
    init = init + *first;
  return init;
}
//这里多提供了一个BinaryOperation参数。之前是执行的求和运算,现在换成binary_op,对每个元素执行binary_op操作,换成减法、乘法都可以,但是并不建议换成违背函数本意的操作。
template <class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init,
             BinaryOperation binary_op) {
  for ( ; first != last; ++first)
    init = binary_op(init, *first);
  return init;
}
inner_product

该函数用于计算[first1, last1)和[first2, first2 + (last1 - first1))的点积,最后加上init的值。

template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init) {
  //遍历[first1, last)以及[first2, first2 + (last1 - first1))
  for ( ; first1 != last1; ++first1, ++first2)
    init = init + (*first1 * *first2);
  return init;
}

//该版本的inner_product不是执行init + (*fist1 ) * (*first2)操作,而是执行传入的binary_op1以及binary_op2操作
template <class InputIterator1, class InputIterator2, class T,
          class BinaryOperation1, class BinaryOperation2>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init, BinaryOperation1 binary_op1,
                BinaryOperation2 binary_op2) {
  for ( ; first1 != last1; ++first1, ++first2)
    init = binary_op1(init, binary_op2(*first1, *first2));
  return init;
}
partial_sum

该函数用于计算局部的和。将*result赋值为*first,将*(result+1)赋值为*first + *(first+1)依次类推。
当传入的迭代器result为first,这就变成了一个质变算法了。

//该函数供partial_sum调用
template <class InputIterator, class OutputIterator, class T>
OutputIterator __partial_sum(InputIterator first, InputIterator last,
                             OutputIterator result, T*) {
  //从first + 1指向的位置开始进行累加并赋值给*result
  T value = *first;
  while (++first != last) {
    value = value + *first;
    *++result = value;
  }
  //注意返回的是result + (last - first)的位置,即当前被赋值末尾元素的下一个位置
  return ++result;
}

//partial_sum算法,版本一
template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result) {
  //处理特殊情况,若first等于last,直接返回
  if (first == last) return result;
  //将*result赋值为*first
  *result = *first;
  //从first + 1开始遍历累加,并将结果返回
  return __partial_sum(first, last, result, value_type(first));
}

//这是针对提供了BinaryOperation的partial_sum算法版本实现的
template <class InputIterator, class OutputIterator, class T,
          class BinaryOperation>
OutputIterator __partial_sum(InputIterator first, InputIterator last,
                             OutputIterator result, T*,
                             BinaryOperation binary_op) {
  //不同之处在于之前的累加操作换成了binary_op二元操作
  T value = *first;
  while (++first != last) {
    value = binary_op(value, *first);
    *++result = value;
  }
  return ++result;
}

//partial_sum版本二,提供了自己的二元操作
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result, BinaryOperation binary_op) {
  if (first == last) return result;
  *result = *first;
  return __partial_sum(first, last, result, value_type(first), binary_op);
}
adjacent_difference

该函数用于计算[first, last)中相邻元素之间的差。它将*result的值赋为*first,然后在[first+1, last)范围内的元素,分别计算*(first) - *(first-1)的值,然后分别赋值给*(result + 1)。
在不使用自己提供的binary_op情况下,它和partial_sum互为逆运算。比如{1, 2, 3, 4, 5},执行adjacent_difference之后,结果为{1, 1, 1, 1, 1},然后再对{1, 1, 1, 1, 1}执行partial_sum,结果又恢复成了原样,为{1, 2, 3, 4, 5}。

//该函数实现了adjacent_difference函数的主要功能,供adjacent_difference调用。和__partial_sum的实现很像,就是执行的二元操作不一样而已。
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;
}

//adjacent_difference,版本一
template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                   OutputIterator result) {
  if (first == last) return result;
  *result = *first;
  return __adjacent_difference(first, last, result, value_type(first));
}

//为提供了binary_op的adjacent_difference版本提供主要操作
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;
}

//adjacent_difference,版本二
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);
}
power

该函数是SGI专属的算法,不在STL的标准中。它的作用是计算x的n次方,当然也可以自己指定运算的类型,比如加法除法之类的。

// Returns x ** n, where n >= 0.  Note that "multiplication"
//  is required to be associative, but not necessarily commutative.

//指定运算类型    
template <class T, class Integer, class MonoidOperation>
T power(T x, Integer n, MonoidOperation op) {
  if (n == 0)
    return identity_element(op);
  else {
    //当n为偶数,不断的执行op,然后将n/2,直到n为奇数
    while ((n & 1) == 0) {
      n >>= 1;
      x = op(x, x);
    }
    //对n为奇数时进行计算
    T result = x;
    n >>= 1;
    while (n != 0) {
      x = op(x, x);
      if ((n & 1) != 0)
        result = op(result, x);
      n >>= 1;
    }
    return result;
  }
}

//调用上面的版本,通过multiplies<T>()表示做乘法运算
template <class T, class Integer>
inline T power(T x, Integer n) {
  return power(x, n, multiplies<T>());
}

上面计算x的n次方的计算方式并不是依次相乘,而是采用的快速幂算法。区分奇偶,计算x^n的值,只需要O(logn)的复杂度,而不是O(n)。
快速幂算法的公式如下:

  • a^b = (a^2)^b/2,b为偶数
  • a^b = (a^2)^b/2*a,b为奇数

比如2的4次方,并没有采用(2)*(2)*(2)*(2)这样依次相乘的算法,而是采用(2*2)*(2*2),这样的做法,这种只用2次运算,而依次相乘需要4次运算。

itoa

该函数由SGISTL提供,并不在STL标准中。
它并不是那个C语言里面实现的整数转字符串的函数。
而是在[first, last)区间内将元素的值依次设置为value, value + 1, value + 2......
这是一个质变算法,改变了传入的迭代器范围指向的元素的值。

template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value) {
  while (first != last) *first++ = value++;
}

小结

本小节对stl_numeric.h中的算法进行了分析,里面大部分算法都很简单,也就power算法稍微需要理解下,如果有算法基础也很容易理解。除了注重算法本身,也要注意它是如何实现泛化的,这点同样也很重要。

MIMO技术入门 MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利 阅读详情

相关推荐

基于51单片机的智能灌溉系统

基于51单片机的智能灌溉系统

jiejiezuishuai的博客 2102

标准库头文件:numeric

1.常用操作 iota(vec.begin(), vec.end(), 2);//将vec填充成2开始的递增序列 accumulate(vec1.begin(), vec1.end(), 0);//累加区间内的和,初值是0 reduce(vec1.begin(), vec1.end(), 0);//累加区间内的和,初值是0,和accumulate相似,但是执行速度更快,C++17支持 inne...

zhuikefeng的博客 480

利用 Docker Distribution 搭建私有的 Docker Registry

1、拓扑

weixin_44983653的博客 1067

MyTinySTL阅读笔记---算法

算法

c++小白的博客 1168

如何利用GMS构建地下水数值模拟模型?

第一步:点图中三维网格的图标然后点Grid→Create Grid这个界面是用于创建一个有限差分网格的设置窗口。它允许你定义网格在三维空间中的范围、分辨率以及其他相关属性。这个界面提供了一个直观的方式来定义一个三维的有限差分网格,你需要指定每个维度上的范围、划分的单元格数量,以及一些控制单元格大小分布和网格方向的参数。这个网格通常会被用于数值模拟,例如地下水流模拟。在点击 "OK" 之前,请务必仔细检查所有参数是否符合你的建模需求。1. X-Dimension (X 轴维度)2. Y-Dimension (

weixin_44259522的博客 2093

CANoe诊断测试避坑指南:DTC故障注入与ECU刷写失败的N个常见原因排查

本文深入解析CANoe诊断测试中的常见问题,重点探讨DTC故障注入与ECU刷写失败的排查策略。从会话管理、安全访问到数据完整性校验,提供实战经验与CAPL脚本示例,帮助工程师规避诊断测试中的典型陷阱,提升车载网络通信与ECU刷写的可靠性。

weixin_29278805的博客 461

STL源码剖析之数值算法<numeric.h>

一、accumulate 作用:初始化init,对区间[first,last)的迭代器i执行init += *i或init = binaryop(init,*i)。  template //版本1,用来计算init和[first,last)区间元素的总和 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __in

HappyToEat的博客 615

Python爬虫终极指南:异步爬虫+Playwright逆向,高效爬取携程旅游数据

Playwright解决动态渲染和加密参数难题,模拟真实浏览器环境;aiohttp异步提升抓取效率,结合代理池和并发控制规避风控;指纹伪装、行为模拟等技巧大幅降低被检测概率。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2950

STL源码剖析——数值算法stl_numeric.h

本文讲解了STL算法中的数值算法,在源码中给出了详细的剖析,同时给出例子进行说明。

关注校招求职,微信号:job_campus 1886

Qwen-Image(阿里通义千问)技术浅析(一)

Qwen-Image(阿里通义千问多模态模型)是阿里巴巴推出的视觉-语言多模态大模型,能够理解图像内容并完成复杂的跨模态任务。

m0_75253143的博客 677

2024年09月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

小杨购物 【题目描述】 小杨有n元钱用于购物。商品A的单价是a元,商品B的单价是b元。 小杨想购买相同数量的商品A和商品B。 默认小猫角色和白色背景,编写程序请你帮小杨计算出他最多能够购买多少个商品A和商品B。 【输入描述】 新建变量“n”用于存储小杨购物的金额。 新建变量“a”用于存储商品A的价格。 新建变量“b”用于存储商品B的价格。 1≤n,a,b≤100000 如下图所示: 图片 【输出描述】 新建变量“result”用于存储小杨最多购买商品A和商品B的个数。 如下图所示:

人生就是一个不断学习的过程 496

STL 简单 <stl_numeric.h> 算法的实现

1.简介 在STL中,算法可以大致分为两类:质变算法、非质变算法。质变算法会改变操作对象的值,非质变算法不会改变操作对象的值。所有的STL算法都作用在迭代器(iterator)所标识的区间上。          本文介绍的数值算法包括: 1.      accumulate:计算 [ first,last ) 内所有元素的总和; 2.      adjacent_difference:计算

chengonghao的博客 758

VEML7700环境光传感器原理图设计,已量产(光线传感器)

最近做便携显示设备的自动亮度调节模块,最终敲定了 VEML7700 这款数字光传感器 —— 一是它 0~120klx 的宽量程刚好覆盖 “暗室→户外强光” 的全场景,二是 Filtron™技术让它的光谱响应和人眼高度贴合,测出来的 “亮度” 更符合实际视觉感受,加上 O-Trim™技术把输出公差压到 10% 以内,省了不少后期校准的功夫。搭好电路后串口直接读 lx 数值,稳定性和精度都够,这篇聊聊这个模块的硬件设计细节。

不脱发的程序猿 600

SGISTL源码阅读二十六 数值算法 (stl_numeric.h)

SGISTL源码阅读二十六 数值算法 (stl_numeric.h) 前言 上一篇博客我们简要介绍了一下STL中的算法,所有的数值算法都是放在&lt;stl_numeric.h中的。 深入源码 accumulate 该算法是做累加操作,将指向范围的元素累加到init上,并且将init作为返回值返回,若init为0,则是计算迭代器指定范围值的累加和。要求迭代器类型至少为InputIterator /...

Lyn&Xx 403

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SGISTL源码探究-STL中的算法(前言)

前言我们目前已经分析了STL中的六大组件的一半。剩下的还有算法、仿函数、配接器,已经分析了配置器、迭代器、容器部分。接下来进入到剩下的三大组件中最复杂的算法部分,关于STL中的算法,它实现了很多功能,但是分析这部分的时候我只打算选择一部分比较经典的算法进行分析(因为这部分的算法实在是太多了),只要掌握了分析的方法,以后自己遇到其他的STL算法或者感兴趣的,直接阅读源码就行了。概览大致分类STL中的算

Move_now的博客 589

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SGISTL源码阅读 算法 前言

SGISTL源码阅读 算法 前言 STL有六大组件,我们已经分析了空间配置器、迭代器和容器,现在将进入对算法的学习。 STL中实现了很多极具复用价值的算法,排序(sorting),查找(searching),排列组合(permutation),用于数据移动、复制、删除、比较、组合、运算等的算法。所有STL算法都作用在由迭代器[first,last)所标示出来的范围内,在进入正式分析算法之前,我们先...

Lyn&Xx 391

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《STL源码剖析》---stl_numeric.h阅读笔记

STL中的数值算法。包括累加、乘幂、计算差值。

KangRoger的专栏 2059

STL源码剖析(十八)数值算法<stl_numeric.h>

namespace std _GLIBCXX_VISIBILITY(default) { template<typename _ForwardIterator, typename _Tp> void iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value) { // concept requirements __glibcxx_function_requires(_

mei_true的博客 319

《STL源码剖析》chapter6 算法

STL算法概述 所有泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间,该区间是一个前闭后开区间,即[first,last)。 由前面章节我们知道,STL中迭代器可以分为5类,在每一个STL算法的声明中,都表现出它所需要的最低程度的迭代器类型。 所有数值算法,包括adjacent_difference(),accumulate(),inner_product(),partial_sum()等等,都实现于stl_numeric.h文件中,这是个内部文件,STL规定用户必须

qq_39621037的博客 148

C++程序员应了解的那些事(32)STL 源码剖析-算法stl_numeric.h

<1>accumulate 描述:计算 init 和 [first, last) 内所有元素的总和 源码: //version1-普通操作版本 template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init) { for ( ; first != last; ++first) init = init + *first; re.

qfturauyls的博客 247

C++ STL数值算法(头文件numeric内)

accumulate //版本1 template &lt;typename InputIterator, typename T&gt; T accumulate(InputIterator first, InputIterator last, T init) { for ( ; first != last; ++first) init = init + *first; return ...

程序人生 4931

《STL源码剖析》第六章笔记

文章目录复杂度标记法仿函数(functor)数值(numeric)算法错误?智能指针ostream_iteratoriotainserter()reverse_iterator辗转相除法可以进行小改进?建议反复学习的算法列表 复杂度标记法 // 《STL源码剖析》,p287 如果有任何正值常数 ccc 和 N0N0N0,使得当 N≥N0N \ge N_0N≥N0​ 时,T(N)≤cF(N)T(N) \le cF(N)T(N)≤cF(N),那么我们便可将 T(N)T(N)T(N) 的复杂度表示为 O(F(N

荣书的博客 328

stl-numeric库使用

文章目录accumulatepartial_sumadjacent_diffentenceinner_productiota accumulate 累加运算。它的特点是参数中有初始值。 template <class InputIterator, class T> T accumulate (InputIterator first, InputIterator last, T init...

Starr 389

算法之快速幂运算的实现方法

快速幂运算(反复平方法) 先来看一道题目:题目链接 本题代码在最后哦~ 快速幂运算的优势: 1.可用来算大数的幂的一种算法。 2.其时间复杂度为 O(log₂N), 如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,与朴素的O(N)相比效率有了极大的提高。 快速幂算法的核心思想:每一步都把指数分成两半,而相应的底数做平方运算。 如这张图片上所写的计算2的n次方所示,可以进行对底数做平方,幂做除2运算。 算法如何实现? 首先我们要知道对于幂是偶数时我们可以这样操作,如果幂是奇数呢? 如计算123的

JixTlhh的博客 2788

STL algorithm/numeric 函数总结

STL algorithm函数总结一级目录 一级目录

Yang_137476932的博客 972

STL之numeric

.

https://gitee.com/liuyuan185442111/chest-view 792
上一篇: SGISTL源码探究-STL中的算法(前言)
下一篇: Centos7下一步一步安装YCM插件(附vimrc配置文件)
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值