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

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

一、accumulate

作用:初始化init,对区间[first,last)的迭代器i执行init += *i或init = binaryop(init,*i)。 

template <class _InputIterator, class _Tp>//版本1,用来计算init和[first,last)区间元素的总和
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
{
  for ( ; __first != __last; ++__first)
    __init = __init + *__first;
  return __init;
}

template <class _InputIterator, class _Tp, class _BinaryOperation>//版本2,对迭代器中每一个元素时执行二元操作
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
               _BinaryOperation __binary_op)
{
  for ( ; __first != __last; ++__first)
    __init = __binary_op(__init, *__first);
  return __init;
}
二、inner_product

作用:初始化init,对区间[first1,last1)和[first2,first2+(last1-first1))的两个迭代器i和j执行init += *i**j或init = binaryop1(init,binaryop1(*i,*j))。 

template <class _InputIterator1, class _InputIterator2, class _Tp>//版本1,两个迭代器元素的内积
_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
                  _InputIterator2 __first2, _Tp __init)
{
  for ( ; __first1 != __last1; ++__first1, ++__first2)
    __init = __init + (*__first1 * *__first2);
  return __init;
}

template <class _InputIterator1, class _InputIterator2, class _Tp,
          class _BinaryOperation1, class _BinaryOperation2>  //版本2,两个迭代器的二元操作,提供operator+和operator*
_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
                  _InputIterator2 __first2, _Tp __init, 
                  _BinaryOperation1 __binary_op1,
                  _BinaryOperation2 __binary_op2)
{
  for ( ; __first1 != __last1; ++__first1, ++__first2)
    __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
  return __init;
}
三、partial_num

作用:局部计算总和,*first赋值给*result,*first+*(first+1)赋值给*(result+1),依次类推,直至first==last。原始序列为[1,2,3,4,5],执行后得到[1,3,6,10,15]。

template <class _InputIterator, class _OutputIterator, class _Tp>
_OutputIterator 
__partial_sum(_InputIterator __first, _InputIterator __last,
              _OutputIterator __result, _Tp*)
{
  _Tp __value = *__first;
  while (++__first != __last) {
    __value = __value + *__first;
    *++__result = __value;//记录每次两个元素相加的值
  }
  return ++__result;
}
template <class _InputIterator, class _OutputIterator>//版本1
_OutputIterator 
partial_sum(_InputIterator __first, _InputIterator __last,
            _OutputIterator __result)
{
  if (__first == __last) return __result;//没有元素返回空
  *__result = *__first;//*first赋值给result第一个元素
  return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first));//result从第二个元素开始记录两两相加的结果
}

template <class _InputIterator, class _OutputIterator, class _Tp,
          class _BinaryOperation>
_OutputIterator 
__partial_sum(_InputIterator __first, _InputIterator __last, 
              _OutputIterator __result, _Tp*, _BinaryOperation __binary_op)
{
  _Tp __value = *__first;
  while (++__first != __last) {
    __value = __binary_op(__value, *__first);//两两元素执行二元操作
    *++__result = __value;
  }
  return ++__result;
}

template <class _InputIterator, class _OutputIterator, class _BinaryOperation>//版本2
_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

作用:计算相邻元素的差。原始序列为[1,2,3,4,5],执行partial_num后得到[1,3,6,10,15],再执行adjacent_difference后得到[1,2,3,4,5]。

template <class _InputIterator, class _OutputIterator, class _Tp>
_OutputIterator 
__adjacent_difference(_InputIterator __first, _InputIterator __last,
                      _OutputIterator __result, _Tp*)
{
  _Tp __value = *__first;
  while (++__first != __last) {
    _Tp __tmp = *__first;
    *++__result = __tmp - __value;//计算相邻元素的差额
    __value = __tmp;
  }
  return ++__result;
}

template <class _InputIterator, class _OutputIterator>//版本1
_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));
}

template <class _InputIterator, class _OutputIterator, class _Tp, 
          class _BinaryOperation>
_OutputIterator
__adjacent_difference(_InputIterator __first, _InputIterator __last, 
                      _OutputIterator __result, _Tp*,
                      _BinaryOperation __binary_op) {
  _Tp __value = *__first;
  while (++__first != __last) {
    _Tp __tmp = *__first;
    *++__result = __binary_op(__tmp, __value);//相邻元素的二元操作
    __value = __tmp;
  }
  return ++__result;
}

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之列)

作用:指定元素的n次方

template <class _Tp, class _Integer>
inline _Tp __power(_Tp __x, _Integer __n)
{
  return __power(__x, __n, multiplies<_Tp>());//指定操作为乘法,则为乘幂
}
template <class _Tp, class _Integer, class _MonoidOperation>//幂次方
inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __opr)
{
  return __power(__x, __n, __opr);
}

template <class _Tp, class _Integer>
inline _Tp power(_Tp __x, _Integer __n)
{
  return __power(__x, __n);
}
六、itoa(SGI专属,不在STL之列)

作用:设定某个区间内容

template <class _ForwardIter, class _Tp>
void 
iota(_ForwardIter __first, _ForwardIter __last, _Tp __value)
{
  while (__first != __last)
    *__first++ = __value++;
}





从零构建:如何用MATLAB工具箱打造你的第一个多体动力学仿真模型 本文详细介绍了如何使用MATLAB的Simscape Multibody工具箱从零开始构建多体动力学仿真模型,特别适合初学者学习倒立摆系统的建模与仿真。文章涵盖环境准备、坐标系设置、物理模型构建、参数化建模及性能优化等关键步骤,帮助工程师快速掌握这一强大的仿真工具。 阅读详情

相关推荐

大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows

大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑

xbsigeibwkouvfcj的博客 3430

标准库头文件: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

学习笔记( 11 ) - 解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

烟溪彭于晏的博客 2万+

MyTinySTL阅读笔记---算法

算法

c++小白的博客 1168

多模态脑区细分图谱 HCP-MMP v1.0, Glasser et al. 2016 皮层和皮下区域,简写和全称对应关系

人类连接组计划多模态脑区细分图谱(HCP-MMP)提供了对人类大脑皮层区域的非常有用的细分(Glasser et al. 2016a, b)。图谱是多模态的,因为每个区域都是根据四个标准的组合定义的,包括结构(T1加权/T2加权髓鞘含量和皮层厚度图)、静息态功能连接、基于任务的激活和拓扑地形组织。HCP-MMP v1.0图谱包含每个半球180个皮层区域,基于210名参与者的分析。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2619

某瓜数据app 获取达人直播商品信息接口 Sign

某瓜数据app 获取达人直播商品列表接口 Sign

自成背后的博客 6039

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

前言上一小节中,我们对stl中的算法部分做了一个大致的说明。本小节我们将进入到其中关于数值算法的部分,都在stl_numeric.h文件中。废话不多说,直接看源码吧。stl_numericaccumulate注意该算法要求了迭代器的类型至少是InputIterator类型,如果是OutputIterator类型,肯定是不行的。 用于计算元素总和,init加上[first, last)范围内的元素之

Move_now的博客 682

PCL 点云圆柱形邻域搜索【2026最新版】

圆柱形邻域搜索是KD-tree算法在点云数据处理中的扩展应用,在一些特定场景应用中具有无与伦比的优势。博客长期更新,本文最近一次更新时间为:2026年5月4日。

点云侠的博客 3450

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

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

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

vue:npm安装pnpm报错,npm ERR! code ENOTFOUND,npm ERR! syscall getaddrinfo,npm ERR! errno ENOTFOUND详细排查解决!

vue2 vue3,npm install -g pnpm 安装出现错误,安装pnpm及解决安装失败问题,解决 npm无法安装pnpm问题,npm 安装 pnpm 时 报错 npm ERR! code ENOTFOUND,pnpm无法安装报错,vue npm install -g pnpm安装报错,request to http://registry.cnpmjs.org/pnpm failed, reason: getaddrinfo ENOTFOUND registry.cnpmjs.org,安装pnp

✅ 精选推荐文章 3608

VS Code 重大更新:Agent Skills完美支持!

代码不会骗人,但你的 LLM 可能会编个故事——除非你给它一本《技能手册》。——某位深夜调试成功的 Go 工程师。

weixin_44058951的博客 3459

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

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

chengonghao的博客 758

RK3588 平台部署实战:OpenCV + LibTorch + FFmpeg 环境搭建与深度学习推理全流程解析

现在,你已经掌握了在RK3588上搭建OpenCV+LibTorch+FFmpeg环境的完整流程,也完成了深度学习模型的部署测试。不妨从一个具体的应用场景入手(如检测自家宠物的品种),亲手打造属于你的第一个边缘智能应用——当你看到模型在RK3588上精准输出结果时,你会发现:嵌入式深度学习的门槛,其实并没有想象中那么高。这些依赖是编译OpenCV、FFmpeg的基础,安装过程中若提示权限不足,可在命令前加。若能输出预测的类别索引,则说明环境搭建成功,模型推理流程通畅。文件,实现模型加载、图像预处理与推理。

FJN110的博客 535

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

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

KangRoger的专栏 2059

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《STL源码剖析》chapter6 算法

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

qq_39621037的博客 148

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

五 STL算法(一)数值算法

一  概述: 使用数值算法需要包含头文件,但它们实际定义于中。 二 相关算法: (1)accumulate:用来计算[first,last)内所有元素和init的值的总和。如果希望计算[first,last)中所有数值的总和,应该把init设置为0。 accumulate的定义: //版本1 template T accumulate(InputIterator fi

linux系统、网络编程和分布式计算 830

算法篇!带你领略STL的数值算法<numeric>

本文介绍数值算法: accumulate adjacent_difference inner_product partial_sum power itoa 这些算法STL内部实现于<stl_numberic.h>中,应用层实现应该包含头文件<numberic> 一、accumulate 功能:默认情况下,用来计算init和[first,last...

董哥的黑板报 1207

numeric_limits::max()和windows.h冲突的解决方法

如果在程序中同时导入limits.h和windows.h,并使用numeric_limits::max()或numeric_limits::min()就会发生编译错误: [cpp] view plain copy --------------------Configuration: MultiInGF8 - Win32 Debug--------

Allyli0022的专栏 1467

关于atoi()函数和itoa()函数

1. atoi()     atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。    atoi原型:     int atoi(const char *nptr); 2函数说明编辑 参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \

小博的博客 486

C++ limits头文件的用法(numeric_limits)

numeric_limits::max () 是函数,返回编译器允许的 double 型数 最大值。 类似的 numeric_limits::max () 返回 编译器允许的 int 型数 最大值。 需包含头文件 #include 例子: #include #include using namespace std; main(){ cout ::max () << endl; c

坚持 3万+

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 200

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 308

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 569

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 748
上一篇: Linux命令之文件目录类命令
下一篇: STL源码剖析之基本算法<stl_algobase.h>
ZH_learningblog
博客等级 码龄10年 22粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值