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

  • 本文介绍数值算法:
    • accumulate
    • adjacent_difference
    • inner_product
    • partial_sum
    • power
    • itoa
  • 这些算法STL内部实现于<stl_numeric.h>中,应用层实现应该包含头文件<numeric>

一、accumulate

  • 功能:默认情况下,用来计算init和[first,last)区间内所有元素的总和
  • init一定要提供。这么做的原因是当[first,last)为空区间时仍能获得一个明确的值
  • 版本②接受一个仿函数
  • 返回值:返回计算出的和
  • 版本②中的二元操作符不必满足交换律和结合律

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //15。计算过程:0+1+2+3+4+5
    std::cout << accumulate(iv.begin(), iv.end(), 0) << std::endl;

    //-15。计算过程:0-1-2-3-4-5
    std::cout << accumulate(iv.begin(), iv.end(), 0, minus<int>()) << std::endl;

    return 0;
}

二、adjacent_difference

  • 功能:默认情况下,用来计算[first,last)区间内每两个元素之间的差,并将差保存在参数3所指向的result中
    • 注意对应关系:result[0]=*first、result[1]=*(first+1)-*(first)、result[1]=*(first+2)-*(first+1)...以此类推
  • 版本②接受一个仿函数
  • 该函数与partial_sum互为逆运算。例如对区间1、2、3、4、5执行adjacent_difference获得结果为1、1、1、1、1,再对此结果执行partial_sum,便可以得到原始区间值1、2、3、4、5
  • 返回值:返回参数3

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //将这个迭代器绑定到cout上,作为下面的输出
    ostream_iterator<int> oiter(std::cout, " ");

    //1 1 1 1 1
    adjacent_difference(iv.begin(), iv.end(), oiter);
    std::cout << std::endl;

    //1 3 5 7 9
    adjacent_difference(iv.begin(), iv.end(), oiter, plus<int>());
    std::cout << std::endl;

    return 0;
}

三、inner_product

  • 功能:默认情况下,以init参数为初始值,将[first1,last1)区间内的元素与以first2区间开始的元素进行内积(乘)操作,然后将结果返回
  • 返回值:返回内积的总和
  • 版本②提供两个仿函数参数,第一个用于表示两个区间之间对应元素操作之后是加、还是减等。第二个用于代表函数返回的是[first1,last1)区间与first2区间的各个元素之间是加还是减等

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //65。计算过程:10 + 1*1 + 2*2 + 3*3 + 4*4 + 5*5
    std::cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << std::endl;

    //-65。计算过程:10 - 1+1 - 2+2 - 3+3 - 4+4 - 5+5
    std::cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10,
        minus<int>(), plus<int>()) << std::endl;
    return 0;
}

四、partial_sum

  • 功能:默认情况下,用来计算局部和。在[first,last)区间上,迭代器每移动一次,就将其以及前面所有的元素的值进行一个和,然后保存到存储参数3中
    • 形式是result[0]=*first、result[1]=*(first)+*(first+1)、result[1]=*(first)+*(first+1)+*(first+2)...以此类推
  • 返回值:参数3
  • 备注:运算的时候是从前向后运算,而不是从后向前运算
  • 版本②提供一个仿函数,用来指定是每回运算是加还是减等

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //将这个迭代器绑定到cout上,作为下面的输出
    ostream_iterator<int> oiter(std::cout, " ");

    //1 3 6 10 15
    partial_sum(iv.begin(), iv.end(), oiter);
    std::cout << std::endl;
    
    //1 -1 -4 -8 -13
    partial_sum(iv.begin(), iv.end(), oiter, minus<int>());
    std::cout << std::endl;

    return 0;
}

五、power

  • 功能:返回某数的n幂次方。这里的n幂次是指自己对自己进行某种运算达n次
  • 运算类型可由外界指定。例如指定乘法,那就是乘幂

版本①

版本②

六、itoa

  • 功能:把区间[first,last)内的元素依次改变为:*(first)=value、*(first+1)=value+1、*(first+2)=value+2...、*(first+(last-first-1))=value+(last-first-1)
  • 无返回值
  • 属于质变算法

源码

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    int n = 3;
    iota(iv.begin(), iv.end(), n);

    //3 4 5 6 7
    for (int i = 0; i < iv.size(); ++i)
        std::cout << iv[i] << " ";
    std::cout << std::endl;
    return 0;
}


  • 我是小董,V公众点击"笔记白嫖"解锁更多【C++ STL源码剖析】资料内容。

相关推荐
内容简介 本书选材内容丰富,除了通常数值方法课程内容外,还包含当代科学计算大量用到专题,如求特殊函数值、随机数、排序、最优化、快速傅里叶变换、谱分析、小波变换、统计描述和数据建模、常微分方程和偏微分方程数值解、若干编码算法和任意精度计算等。 本书科学性和实用性统一。每个专题中,不仅对每种算法给出了数学分析和比较,而且根据作者经验对算法做出了评论和建议,并在此基础上给出了用C++语言编写实用程序。读者可以很方便地直接套用这些程序,还可以结合特定需要进行修改。本书中包含345个程序构成了C++语言数值计算程序库。 本书可以作为大学本科生和研究生教材或参考书,也可以作为从事科学计算科技工作者工具书、计算机软件开发者参考书。 目录 第1章 绪论 1.0 引言 1.1 程序组织和控制结构 1.2 科学计算C++约定 1.3 向量和矩阵类实施 1.4 误差、准确性和稳定性 第2章 线性代数方程组求解 2.0 引言 2.1 Gauss-Jordan消去法 2.2 具有回代过程高斯消去法 2.3 LU分解法及其应用 2.4 三对角及状对角系统方程 2.5 线性方程组解迭代改进 2.6 奇异值分解 2.7 稀疏线性方程组 2.8 Vandermonde矩阵和Toeplitz矩阵 2.9 深入讨论:Cholesky分解 2.10 深入讨论:QR分解 2.11 矩阵求逆是否是N3阶运算 第3章 内插法和外推法 3.0 引言 3.1 多项式内插法和外推法 3.2 有理函数内插法和外推法 3.3 三次样条插值 3.4 搜索有序表方法 3.5 插值多项式系数 3.6 二维或高维插值 第4章 函数积分 4.0 引言 4.1 坐标等距划分经典公式 4.2 基本算法 4.3 龙贝格积分 4.4 广义积分 4.5 高斯求积法与正交多项式 4.6 多维积分 第5章 函数求值 5.0 引言 5.1 级数与其收敛性 5.2 边分式求值 5.3 多项式和有理函数 5.4 复数运算 5.5 递推关系及Clenshaw递推公式 5.6 二次方程和三次方程 5.7 数值求导 5.8 切比雪夫逼近 5.9 切比雪夫逼近函数微分和积分 5.10 切比雪夫系数多项式逼近 5.11 深入讨论:幂级数化简 5.12 深入讨论:帕德逼近 5.13 深入讨论:有理切比雪夫逼近 5.14 线积分求函数值 第6章 特殊函数 6.0 引言 6.1 T函数、B函数、阶乘、二项式系数 6.2 不完全T函数、误差函数、X2概率函数、累积泊松函数 6.3 指数积分 6.4 不完全B函数、学生分布、F分布、累积二项式分布 6.5 整数阶贝塞尔函数 6.6 修正整数阶贝塞尔函数 6.7 深入讨论:分数阶贝塞尔函数、艾里函数、球面贝塞尔函数 6.8 球面调和函数 6.9 Fresnel积分、余弦和正弦积分 6.10 Dawson积分 6.11 椭圆积分和雅可比椭圆函数 6.12 超几何函数 第7章 随机数 7.0 引言 7.1 一致偏离 7.2 变换方法:指数偏离和正态偏离 7.3 拒绝方法:伽马偏离、泊松偏离、二项偏离 7.4 随机位生成 7.5 深入讨论:基于数据加密随机序列 7.6 简单蒙特卡罗基分 7.7 准随机序列 7.8 深入讨论:自适应及递归蒙特卡罗方法 第8章 排序 8.0 引言 8.1 直接插入法和Shell方法 8.2 快速排序法 8.3 堆排序法 8.4 索引和分秩 8.5 挑选第M大元素 8.6 深入讨论:等价类确定 第9章 求根与非线性方程组 9.0 引言 9.1 划界与二分 9.2 弦截法、试位法和Ridders方法 9.3 Van Wijngaarden-Dekker-Brent方法 9.4 利用导数Newton-Raphson方法 9.5 多项式根 9.6 非线性方程组Newton-Raphson方法 9.7 非线性方程组全局收敛法 第10章 函数极值 10.0 引言 10.1 一维黄金分割搜索 10.2 抛物线内插和一维Brent方法 10.3 使用一阶导数一维搜索方法 10.4 多维下降单纯形法 10.5 多维情况下方向集(Powell)方法 10.6 多维共轭梯度法 10.7 多维变尺度法 10.8 线性规划和单纯形法 10.9 模拟退火法 第11章 特征系统 11.0 引言 11.1 对称矩阵雅可比变换 11.2 将对称矩阵约化为三对角形式:Givens约化和Householder约化 11.3 三对角矩耻特征值和特征向量 11.4 埃尔米特矩阵 11.5 半一般矩阵化为Householder形式 11.6 实Householder矩阵QR算法 11.7 用逆迭代法改进特征值求解特征向量 第12章 快速傅里叶变换 12.0 引言 12.1 离散样本数据傅里叶变换 12.2 快速傅里叶变换(FFT) 12.3 实函数FFT、正弦变换和余弦变换 12.4 二维或多维FFT 12.5 二维和三维实数据傅里叶变换 12.6 深入讨论:外部存储和局部内存FFT 第13章 傅里叶和谱应用 13.0 引言 13.1 使用FFT做卷积和解卷积 13.2 使用FFT做相关和自相关 13.3 具有FFT最优(维纳)滤波 13.4 使用FFT做功率谱估计 13.5 深入讨论:时域中数字滤波 13.6 线性预测和线性预测编码 13.7 深入讨论:用最大熵(全极)方法做功率谱估计 13.8 深入讨论:用非均匀取样数据谱分析 13.9 深入讨论:使用FFT计算傅里叶积分 13.10 小波变换 13.11 深入讨论:取样定理数值应用 第14章 数据统计描述 14.0 引言 14.1 分布矩:均值、方差、偏斜度等 14.2 两种分布是否具有相同均值和方差 14.3 两种分布是否不同 14.4 两种分布列联表分析 14.5 线性相关 14.6 非参数相关或秩相关 14.7 深入讨论:二维分布 14.8 深入计论:Savitzky-Golay平滑滤波器 第15章 数据建模 15.0 引言 15.1 最大似然估计最小乘方法 15.2 拟合数据成直线 15.3 深入讨论:两个坐标数据都有误差直线拟合 15.4 一般线性最小二乘方 15.5 非线性模型 15.6 被估模型参数置信界限 15.7 稳健估计 第16章 常微分议程组积分 16.0 引言 16.1 Runge-Kutta方法 16.2 Runge-Kutta方法自适应步长控制 16.3 修正中点法 16.4 Richardson外推法和Bulirsch-Stoer方法 16.5 深入讨论;二阶守恒方程组 16.6 刚性方程组 16.7 多步法、多值法和预测-校正法 第17章 两点边值问题 17.0 引言 17.1 打靶法 17.2 对拟合点找靶 17.3 深入讨论;松弛法 17.4 实例:球体调和函数 17.5 深入讨论:网格点自动分配 17.6 深入讨论:内部边界条件或奇异点处理 第18章 积分方程和反演理论 18.0 引言 18.1 第二类Fredholm方程 18.2 Volterra方程 18.3 深入讨论:具有奇异核积分方程 18.4 反演问题与先验信息利用 18.5 线性正则化方法 18.6 Backus-Gilbert方法 18.7 最大熵图像恢复 第19章 偏微分方程 19.0 引言 19.1 通量守恒初值问题 19.2 扩散初值问题 19.3 多维初值问题 19.4 边值问题傅里叶方法和循环约简法 19.5 边值问题松驰法 19.6 边值问题多重网格法 第20章 非典型数值算法 20.0 引言 20.1 诊断机器参数 20.2 格雷码 20.3 循环冗余度校验和其他校验和式 20.4 霍夫曼编码与数据压缩 20.5 算术编码 20.6任意精度运算 附录A 函数声明表 附录B 实用例程和类 附录C 转换为单精度 参考文献 程序从属表 各章节计算机程序
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页