C++ STL 中的数值算法示例讲解

 更新时间:2022年04月08日 09:35:24   作者:Aatrowen  
本片文章讲解了C++STL 中的数值算法,包含iota、accumulate、adjacent_difference、inner_product、partial_sum这些方法的使用,感兴趣的朋友来看看吧<BR>

以下算法均包含在头文件 numeric 中

1.iota

该函数可以把一个范围内的序列从给定的初始值开始累加
先看用法。
例:
假设我需要一个长度为10,从5开始递增的序列

    vector<int> a(10);
    iota(begin(a), end(a), 5);

    for (auto x : a) {
        cout << x << " ";
    }

输出:

5 6 7 8 9 10 11 12 13 14

这样就可以很方便的创建一个递增的序列,而不用使用for循环
此外,该函数是使用连续的支持 operator++()的 T 类型值填充序列
也就是说double类型也可以使用,string类型也可以使用。
只要是重载了++运算符的类型都可以使用。

2.accumulate

曾经在算法比赛中看见别人使用accumulate函数计算出了一个数组的和。
觉得特别的优雅,像这样:

    vector<int> a(10);
    iota(begin(a), end(a), 1);

    cout << accumulate(begin(a), end(a), 0) << "\n";  // 计算从1加到10的和,从0开始加

输出:

55

从那天起,每当我要求一个序列的和的时候,我都会使用这个方法...
但是今天,当我看到accumulate的源码之后:

template <class InputIterator, class T>
   T accumulate (InputIterator first, InputIterator last, T init)
{
  while (first!=last) {
    init = init + *first;  // or: init=binary_op(init,*first) for the binary_op version
    ++first;
  }
  return init;
}

注意看这里:

哇哦,它竟然还支持二元仿函数,详解C++ functional库中的仿函数使用方法
于是,我有了一个大胆的想法。
求一个数组的乘积

    vector<int> a(10);
    iota(begin(a), end(a), 1);

    cout << accumulate(begin(a), end(a), 1, multiplies<int>()) << "\n";  // 计算从1加到10的乘积,从1开始乘

输出:

3628800

同理,还可以求数组的减,数组的除,数组的模😁

3.partial_sum

这个函数可以用来求前缀和,前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。

例如,1、2、3、4、5的前缀和数组为 1 3 6 10 15

    vector<int> a(5);
    iota(begin(a), end(a), 1);

    partial_sum(begin(a), end(a), begin(a)); // 求a的前缀和,赋值给a数组(第三个参数)

    for (auto x : a) {
        cout << x << " ";
    }

输出:

1 3 6 10 15

有了上一个函数的经验,我们还可以求一个数组的前缀乘、除等

例:

    partial_sum(begin(a), end(a), begin(a), multiplies<int>());

输出:

1 2 6 24 120

4.adjacent_difference

这个函数可以对一个序列里相邻两个元素进行运算,通过differerce这个词可以看出来,默认是计算相邻两元素的差

vector<int> a{1, 4, 5, 100, 40};

adjacent_difference(begin(a), end(a), begin(a)); // 求a数组相邻元素的差,赋值给a数组(第三个参数)

for (auto x : a) {
    cout << x << " ";
}

输出:

1 3 1 95 -60

今天我想计算相邻两元素的乘积

adjacent_difference(begin(a), end(a), begin(a), multiplies<int>());

输出:

1 4 20 500 4000

5.inner_product

这个函数默认情况下可以求序列中每个元素的内积之和:

    vector<int> a(3);
    iota(begin(a), end(a), 1);

    cout << inner_product(begin(a), end(a), begin(a), 10) << "\n"; // 从初值10开始加上序列各元素的内积

输出:

24

还可以用来求两个序列元素两两相乘再相加的结果

    vector<int> a{1, 2, 3};
    vector<int> b{2, 3, 4};

    // 1 * 2 + 2 * 3 + 3 * 4
    cout << inner_product(begin(a), end(a), begin(b), 0) << "\n";

输出:

20

此外,还可以通过仿函数来替代上述的两个操作符 + 和 *

    vector<int> a{1, 2, 3};
    vector<int> b{2, 3, 4};

    cout << inner_product(begin(a), end(a), begin(b), 1
                        , multiplies<int>(), minus<int>()) << "\n";
                            // 原来的加法 +  // 原来的乘法 *
                            // 计算 (1 - 2) * (2 - 3) * (3 - 4) = -1

输出:

-1

到此这篇关于C++ STL 中的数值算法示例讲解的文章就介绍到这了,更多相关C++ 数值算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++11如何实现无锁队列

    C++11如何实现无锁队列

    这篇文章主要介绍了C++11如何实现无锁队列,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • C语言中sizeof()与strlen()函数的使用入门及对比

    C语言中sizeof()与strlen()函数的使用入门及对比

    这篇文章主要介绍了C语言中sizeof()与strlen()函数的使用入门及对比,同时二者在C++中的使用情况也基本上同理,是需要的朋友可以参考下
    2015-12-12
  • 讲解C++的do while循环和循环语句的嵌套使用方法

    讲解C++的do while循环和循环语句的嵌套使用方法

    这篇文章主要介绍了讲解C++的do while循环和循环语句的嵌套使用方法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • c++结合opencv如何实现读取多张图片并显示

    c++结合opencv如何实现读取多张图片并显示

    这篇文章主要介绍了c++结合opencv如何实现读取多张图片并显示问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++详细讲解图的遍历

    C++详细讲解图的遍历

    图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历
    2022-05-05
  • vc中使用SendMessage自定义消息函数

    vc中使用SendMessage自定义消息函数

    这篇文章主要介绍了vc中使用SendMessage自定义消息函数的相关资料,需要的朋友可以参考下
    2015-06-06
  • C语言中变参函数传参的实现示例

    C语言中变参函数传参的实现示例

    本文主要介绍了C语言中变参函数传参,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++解决业务办理时间问题示例解析

    C++解决业务办理时间问题示例解析

    这篇文章主要为大家介绍了C++解决业务办理时间问题示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C/C++实现的游戏角色名称名字随机生成代码

    C/C++实现的游戏角色名称名字随机生成代码

    这篇文章主要介绍了C/C++实现的游戏角色名称名字随机生成代码,本文特别针对一些古典游戏的角色名称进行随机生成,需要的朋友可以参考下
    2015-05-05
  • 使用C++实现Excel文件与CSV之间的相互转换

    使用C++实现Excel文件与CSV之间的相互转换

    这篇文章主要为大家详细介绍了如何使用C++实现Excel文件与CSV之间的相互转换,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06

最新评论